[英]Swift: Why does ternary operator create copy of an array instead of referencing the original?
我只是注意到使用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
,但是我很想知道為什么會發生這種情況。
Swift數組是值類型,因此每次都會創建一個新副本。 如果您仍要使用三元運算符,請將其更改為:
person.isMale ? maleArray.append(person) : femaleArray.append(person)
如@ luk2302所述,數組是值類型 (它們是結構-請參閱其文檔說它是通用結構,所有結構都是值類型)。 這只是意味着,如果您創建對現有數組的“引用”,則會將其復制-然后,如果使用新變量在數組中追加/刪除或以其他方式修改數組,則不會在原始數組上進行修改。
它與三元運算符無關。 您可以通過以下方法進行測試:
var arrayToAppendTo = person.isMale ? maleArray : femaleArray
至
var arrayToAppendTo = maleArray
而且您會看到它仍然不會修改屬性中的原始數組。
因此,總而言之,您將無法使用中間變量,並且必須直接訪問要更改的數組。
使用@MehulParmar建議的解決方案,或者簡單地使用if-else
:
if person.isMale {
maleArray.append(person)
} else {
femaleArray.append(person)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.