一尘不染

如何在Swift中创建不可变数组?

swift

如何在Swift中创建不可变数组?

简要阅读文档会建议您可以做

let myArray = [1,2,3]

但是可悲的是,这实际上产生了一个可变的,固定大小的数组。这种可变性通常会产生令人困惑的别名和令人怀疑的别名,并且函数会改变其参数:

let outterArray = [myArray, myArray]
outterArray[0][0] = 2000
outterArray //=> [[2000,2,3],[2000,2,3]]   surprise!

func notReallyPure(arr:Int[]) -> () { arr[0] = 3000 }
notReallyPure(myArray)
myArray // => [3000,2,3]

没有比C好多少了。

如果我想要不变性,最好的选择是将其包装NSArray成这样:

let immutableArray = NSArray(myArray: [1,2,3])

好像疯了。我在这里想念什么?

更新(2015-07-26):

这个问题可以追溯到Swift的早期。从那以后,对Swift进行了更新,以使不可变数组实际上是不可变的,如下所示。


阅读 369

收藏
2020-07-07

共1个答案

一尘不染

Xcode 6 beta 3改变了这种情况。正如您所描述的,过去数组是半可变的,它们的元素是可变的,但长度是固定的,现在不可变的数组与字典具有相同的值语义:

从Xcode 6 beta 3发行说明中:

•Swift中的数组已经过完全重新设计,以具有字典和String等在Swift中始终具有的全值语义。这解决了各种可变性问题-
现在’let’数组是完全不变的,’var’数组是完全可变的-
可与Dictionary和String正确组合,并解决其他更深层次的问题。如果您习惯使用NSArray或C数组,则值语义可能会令人吃惊:现在,数组的副本使用高效的惰性副本实现生成所有元素的完整且独立的副本。这是Array的一项重大更改,仍然存在一些性能问题需要解决。请!请参阅Swift编程语言以获取更多信息。(17192555)

Swift书中有关阵列的原始信息已于2014年7月7日更新,以反映beta
3的更改。(如果您像以前一样在Mac上使用iBooks,则可能需要删除并重新下载它才能获取7月7日的更新,但我无法自动更新。)

2020-07-07