【发布时间】:2014-07-28 05:59:47
【问题描述】:
如何在 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 已经更新,因此不可变数组实际上是不可变的,如下面的答案所示。
【问题讨论】:
-
不幸的是,我认为您并没有遗漏什么。恕我直言,这是 Swift 的一个坏特性。
-
我很确定使用元组将保证不变性,尽管我意识到这失去了数组的好处
-
我希望比我更聪明的人理解一个很好的理由。这看起来很疯狂。
-
恕我直言,Swift 是一种非常好的语言,但字符串、数组和字典的设计非常糟糕。
-
@Jeff,我认为这很疯狂,因为我认为不变性应该是默认设置。如果 Swift 要麻烦自己拥有自己的集合类型,而不是仅仅使用 Cocoa,那么我们就不需要使用 Cocoa 来获取不可变数组。