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

alg*_*gal 30 arrays swift

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

对文档的肤浅解读表明你可以做到

let myArray = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,这实际上产生了一个可变的,固定大小的数组.这种可变性创建了常见的谜题,其中包含未预料到的别名和函数,这些谜题会改变其参数:

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]
Run Code Online (Sandbox Code Playgroud)

没比C好多少

如果我想要不变性,那么最好将它包装NSArray成如此:

let immutableArray = NSArray(myArray: [1,2,3])
Run Code Online (Sandbox Code Playgroud)

这看起来很疯狂.我在这里错过了什么?

更新时间(2015-07-26):

这个问题可以追溯到斯威夫特的早期阶段.从那时起,Swift已经更新,因此不可变数组实际上是不可变的,如下面的答案所示.

Mat*_*son 27

这已经改变了Xcode 6 beta 3.虽然数组曾经是半可变的,正如你所描述的那样,它们的元素可以更改但是它们的长度是固定的,现在不可变数组与Dictionaries共享相同的值语义:

来自Xcode 6 beta 3发行说明:

•Swift中的数组已经完全重新设计,具有完全值语义,如Dictionary和String在Swift中一直有.这解决了各种可变性问题 - 现在'let'数组是完全不可变的,'var'数组是完全可变的 - 用Dictionary和String正确组合,并解决其他更深层次的问题.如果您习惯使用NSArray或C数组,则值语义可能会令人惊讶:数组的副本现在使用有效的延迟复制实现生成所有元素的完整且独立的副本.这是Array的一个重大变化,仍有一些性能问题需要解决.请参阅Swift编程语言以获取更多信息.(17192555)

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

  • 我希望那些写下来的人脸红了."不变性对数组的含义略有不同"=="但是,对于数组,不变性意味着可变性" (14认同)

Eon*_*nil 8

似乎是一个错误,很快就会修复.

引自Apple dev论坛:

题:

与let for Array和Dictionary不一致

最终答案:

这被认为是一个错误,而不是一个功能,并将在以后的Beta中修复.
-克里斯