Swift中修改三维矩阵单个元素值致全量变更的解决方案咨询
解决Swift中三维类矩阵修改单个元素导致所有元素变化的问题
这个问题我之前也碰到过,核心原因是Swift里类是引用类型,而你用repeating初始化数组的方式,其实是把同一个B实例的引用重复填充到了数组的所有位置。也就是说,整个三维矩阵里的所有“元素”,本质上都指向内存里同一个B(b: -1)对象,所以你修改任何一个位置的b属性,其实都是在修改这个唯一的实例,自然所有位置看起来都变成7了。
解决办法:确保每个数组位置都是独立的B实例
不要用repeating直接复用同一个引用,而是用嵌套的map来逐个创建新的B对象,这样每个位置的元素都是独立的实例:
// 方式1:结合repeating和内层map,兼顾简洁性 var k: [[[B]]] = Array(repeating: Array(repeating: (0..<2).map { _ in B(b: -1) }, count: 4), count: 3) // 方式2:更直观的多层map,清晰体现三维结构 var k: [[[B]]] = (0..<3).map { _ in (0..<4).map { _ in (0..<2).map { _ in B(b: -1) } } }
现在你再执行k[0][1][1].b = 7,就只会修改这个特定位置的b值,其他元素的b还是保持-1不变。
额外说明
如果你的B是结构体(值类型),那原来用repeating的方式是完全没问题的——因为结构体在赋值时会做值复制,每个数组位置都是独立的副本。但因为你用的是类(引用类型),必须手动确保每个元素都是新创建的实例,避免引用复用的问题。
内容的提问来源于stack exchange,提问作者Tuan Huynh
相关产品推荐
相关产品推荐

