是否有可能避免swift中的结构变异?

时间:2014-09-23 19:43:12

标签: swift

是否可以让struct的行为像对象一样。 F.e:

var arr = [1]
let arr1 = arr 
arr.append(1)

我想让arr1和arr一样。包装成对象是唯一的选择吗?

2 个答案:

答案 0 :(得分:6)

你所描述的是Swift中结构和对象之间行为的根本区别之一。结构总是按值复制。所以不,如果你想通过引用语义进行复制,你将不得不使用一个对象。

答案 1 :(得分:2)

除了@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]]