我刚刚注意到在使用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,但maleArray
和femaleArray
均为空。
任何人都可以解释为什么会这样吗?
注意:我知道我可以做if/else
追加,但我很想知道为什么会出现这种情况。
答案 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)
}