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

9 浏览
0 Comments

在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从那时起已经更新,因此不可变数组实际上是不可变的,正如下面的答案所示。

admin 更改状态以发布 2023年5月20日
0
0 Comments

看起来是一个bug,很快就会修复。

引用自苹果开发者论坛

问题:

数组和字典中的let不一致

最终答案:

这被认为是一个bug,而不是一个功能,将在以后的Beta版本中修复。
-Chris

0
0 Comments

这在Xcode 6 beta 3中已经改变了。虽然数组以前是半可变的,就像你所描述的那样,它们的元素是可变的,但长度是固定的,但现在不可变的数组与字典具有相同的值语义:

来自Xcode 6 beta 3版本说明:

• Swift中的数组已经被完全重新设计为具有字典和字符串一直在Swift中具有的完全值语义。这解决了各种可变性问题 - 现在“let”数组是完全不可变的,“var”数组是完全可变的 - 与字典和字符串组合正确,并解决了其他更深层次的问题。如果您习惯于NSArray或C数组,值语义可能会令人惊讶:数组的副本现在使用高效的惰性复制实现生成所有元素的完整且独立的副本。这是Array的主要变化,仍有一些性能问题需要解决。请参阅Swift编程语言了解更多信息。(17192555)

有关Swift书中数组的原始信息已于2014年7月7日进行了更新,以反映beta3的更改。(如果您正在使用Mac上的iBooks,就像我一样,您可能需要删除并重新下载它以获取7月7日的更新 - 我无法自动更新它。)

0