簡體   English   中英

Swift:為什么三元運算符創建數組的副本而不是引用原始數組?

[英]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,但是maleArrayfemaleArray均為空。

誰能解釋為什么會這樣?

注意:我知道我可以附加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM