Swift:为什么三元运算符会创建数组的副本而不是引用原始数据?

时间:2018-02-28 18:22:48

标签: ios swift reference copy ternary-operator

我刚刚注意到在使用Swift的三元运算符时我没有预料到的一些行为。我有两个数组,根据条件,我想附加到一个或另一个。但是,它不会附加到我的类级数组,而只是附加到本地副本。

我假设因为我使用的是自定义类对象的数组,所以它会引用它们而不是创建副本。

示例场景:

class MyViewController: UIViewController {
    var maleArray: [Person] = []
    var femaleArray: [Person] = []

    func append(person: Person) {
        var arrayToAppendTo = person.isMale ? maleArray : femaleArray
        arrayToAppendTo.append(person)
    }
}

在致电append(person:)时,arrayToAppendTo的计数为1,但maleArrayfemaleArray均为空。

任何人都可以解释为什么会这样吗?

注意:我知道我可以做if/else追加,但我很想知道为什么会出现这种情况。

2 个答案:

答案 0 :(得分:2)

Swift数组是值类型,因此每次都会生成一个新副本。 如果您仍想使用三元运算符,请将其更改为:

person.isMale ? maleArray.append(person) : femaleArray.append(person)

答案 1 :(得分:0)

正如@ luk2302所述,数组是value types(它们是结构 - 看它的docs表示它是通用结构,所有结构都是值类型)。这只是意味着如果你创建一个现有数组的“引用”,它将被复制 - 然后如果追加/删除,或者使用新变量修改数组,则不会对原始数组进行修改。

它与三元运算符无关。您可以通过更改:

来测试它
var arrayToAppendTo = person.isMale ? maleArray : femaleArray

var arrayToAppendTo = maleArray

你会发现它仍然不会修改属性中的原始数组。

总而言之,您将无法使用中间变量,您将不得不直接访问要更改的数组。

使用@MehulParmar建议的解决方案或只是if-else

if person.isMale {
    maleArray.append(person)
} else {
    femaleArray.append(person)
}