【发布时间】:2014-11-18 03:39:22
【问题描述】:
是否可以让 struct 表现得像一个对象。 F.e.:
var arr = [1]
let arr1 = arr
arr.append(1)
我想让 arr1 与 arr 相同。包装成一个对象是唯一的选择吗?
【问题讨论】:
-
所以你不想避免结构突变。你想拥抱结构突变!
标签: swift
是否可以让 struct 表现得像一个对象。 F.e.:
var arr = [1]
let arr1 = arr
arr.append(1)
我想让 arr1 与 arr 相同。包装成一个对象是唯一的选择吗?
【问题讨论】:
标签: swift
您所描述的是 Swift 中结构和对象之间行为的根本区别之一。结构总是按值复制。所以不,如果你想通过引用语义复制,你将不得不使用一个对象。
【讨论】:
除了@ChrisK 的回答之外,我看不到从不同变量引用同一个数组的许多实际用途,除非您想要实现的是将它传递给函数/方法 - 在这种情况下,您 可以使用inout修饰符通过引用传递:
var array = [1, 2, 3]
func changeArray(inout array: [Int]) {
array.append(4)
}
changeArray(&array)
阅读更多关于In-Out Parameters
更新您在评论中提到了一个非常好的用例。这让我找到了一个解决方案,它更像是一种解决方法 - 重要的是它有效。
使用 NSMutableArray 而不是 swift 数组。这是一门课程,因此它具有您正在寻找的所有优势。操场上的示例:
var arr: NSMutableArray = [
NSMutableArray(array: [1, 2, 3])
]
arr[0].addObject(4)
arr[0].replaceObjectAtIndex(0, withObject: -1)
arr // This prints [[-1, 2, 3, 4]]
【讨论】:
NSMutableArray 是您要找的。span>