You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift开发:如何将对象数组按引用传递给函数

如何正确通过引用传递对象数组并修改其值?

咱们先看你现有的代码:你已经用了inout参数标记referenceArray,方向是对的,但目前有两个关键问题没处理好,导致没法正确修改原始数组的值,我给你一步步拆解:

1. 先踩异步请求的坑

你用URLSession发起的网络请求是异步执行的——也就是说,UpdateButtonPressed函数会先执行完返回,之后网络请求的回调闭包才会触发。如果直接在闭包里修改inout参数,这时候函数的生命周期已经结束,inout参数对应的原始变量可能已经被销毁,会导致不可预期的行为。

2. 必须把处理结果赋值回原始数组

你现在在函数里创建了_itemList,但没把这个新数组赋值给referenceArray,所以原始数组根本不会被更新。

修改后的完整代码示例

// 先确保Item是class(要修改对象内部属性)或遵循Codable(要解析JSON)
class Item: Codable {
    // 你的Item属性示例
    var id: Int
    var name: String
    
    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}

func UpdateButtonPressed(_ urlString: String, referenceArray: inout Array<Item>) {
    // 校验URL合法性,避免强制解包崩溃
    guard let url = URL(string: urlString) else {
        print("无效的URL")
        return
    }
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    
    let session = URLSession.shared
    let task = session.dataTask(with: request) { data, response, error in
        // 处理网络错误
        guard let data = data, error == nil else {
            print("请求失败:\(error?.localizedDescription ?? "未知错误")")
            return
        }
        
        // 解析JSON到新数组(假设接口返回Item数组的JSON)
        do {
            let parsedItems = try JSONDecoder().decode([Item].self, from: data)
            // 回到主队列更新数组(保证变量生命周期,UI操作也必须在主队列)
            DispatchQueue.main.async {
                // 方式1:直接替换整个原始数组
                referenceArray = parsedItems
                
                // 方式2:如果要修改原始数组里的现有对象属性(仅当Item是class时生效)
                // for (index, newItem) in parsedItems.enumerated() {
                //     if index < referenceArray.count {
                //         referenceArray[index].id = newItem.id
                //         referenceArray[index].name = newItem.name
                //     }
                // }
            }
        } catch {
            print("JSON解析失败:\(error.localizedDescription)")
        }
    }
    task.resume()
}

调用函数的正确姿势

调用时要在数组变量前加&符号,告诉Swift要传递引用:

// 你的原始数组
var myItemList = [Item]()
// 调用更新函数
UpdateButtonPressed("https://your-api-url.com", referenceArray: &myItemList)

额外注意点

  • 如果你的Item是struct(值类型),即使数组用了inout,修改数组内对象的属性也不会同步到原始对象——因为struct是值传递,每次修改都会生成新副本。这种情况下,要么把Item改成class(引用类型),要么直接替换整个数组(就是上面的方式1)。
  • 若数组和UI绑定,一定要在主队列里更新,否则会导致UI更新异常。

内容的提问来源于stack exchange,提问作者user7787622

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:44:10