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

Swift开发:如何获取数组数组中原数组的引用而非副本?

Swift数组赋值后无法同步更新?看这篇就够了!

嘿,作为Swift新手碰到这个问题太正常啦!我来给你把事情掰扯明白~

为啥会出现这种情况?

敲黑板划重点:Swift里的数组是值类型!啥意思呢?就是当你把一个数组赋值给另一个变量、或者从二维数组里取出某个子数组赋值的时候,Swift会自动给你创建一个数组的完整副本。这个副本和原数组是完全独立的两个东西,所以原数组后续修改的时候,副本根本不会跟着变——毕竟俩都不是同一个东西了嘛!

怎么解决?用引用类型包装一下!

既然值类型会拷贝,那咱们就用引用类型来搞定。Swift里的类是引用类型,赋值的时候传递的是对象的引用(简单说就是“指向同一个东西的指针”),这样修改原对象的时候,你的变量指向的还是同一个对象,自然就能同步更新了。

给你写个具体的代码示例:

首先定义一个用来包装数组的类:

class ArrayWrapper {
    var items: [Int]
    
    init(items: [Int]) {
        self.items = items
    }
}

然后把你原来的全局数组改成这个类的实例:

// 原来的g1/g2/g3改成类实例
var g1 = ArrayWrapper(items: [2,0,0,0,0])
var g2 = ArrayWrapper(items: [2,0,0,0,0])
var g3 = ArrayWrapper(items: [2,0,0,0,0])

// 你的二维数组现在存的是类实例(引用)
var globalGrid = [g1, g2, g3]

现在再赋值试试:

// 取出数组里的第一个元素赋值给变量——这次拿到的是引用!
var currentItem = globalGrid[0]

// 修改原数组里的元素
globalGrid[0].items[1] = 4

// 看看currentItem的变化
print(currentItem.items) // 输出 [2,4,0,0,0],和原数组同步了!

额外小提醒

如果你不想用类,还有更底层的办法比如用UnsafeMutablePointer操作指针,但这个对新手来说太容易踩坑了,不推荐。还是用类包装的方法最稳妥、最符合Swift的编程习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:19:11