使用'import Foundation'后Swift数组的行为有何不同?

5
当我运行以下代码时,我得到了预期的输出:
var a = [1, 2, 3]
var b = a

if a === b { println("a === b") }
if a == b { println("a == b") }

输出:

a === b

a == b

但是,如果我突然导入 Foundation,我只会得到一个新的输出:

import Foundation    

var a = [1, 2, 3]
var b = a

if a === b { println("a === b") }
if a == b { println("a == b") }

输出:

a == b

有人知道背后发生了什么吗?谢谢。

1个回答

5
这与可变性有关,尽管import Foundation部分很有趣。我猜它与NSArrayNSObject的复制有关。
您可以通过将var更改为let, 并观察===再次变为true来进行测试。
测试不同的排列组合,看看会发生什么:

两个可变

var a = [1, 2, 3]
var b = a

if a === b { println("arrays are the same instance") }  // false
if a == b { println("arrays are equivalent") }  // true

可变源,不可变副本

var a = [1, 2, 3]
let b = a

if a === b { println("arrays are the same instance") }  // false
if a == b { println("arrays are equivalent") }  // true

不可变源,可变副本

let a = [1, 2, 3]
var b = a

if a === b { println("arrays are the same instance") }  // false
if a == b { println("arrays are equivalent") }  // true

两者都是不可变的

let a = [1, 2, 3]
let b = a

if a === b { println("arrays are the same instance") }  // true
if a == b { println("arrays are equivalent") }  // true

当需要时,这实际上是制作防御性副本的正确行为。

如果您的源是可变的,则必须进行复制,否则可能会在外部进行更改。如果您想要可变的副本,当然需要进行复制。

只有当源和副本都是不可变的时候,才不会进行复制,因为这样做是浪费的。


是的,这似乎是事实... 这很有趣,但我更感兴趣的是Foundation导入对激活此行为的影响。 - will.fiset
可能是因为它导入了Foundation.NSArray,该库处理这些类型的后备存储。 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接