2017-07-20 28 views
1

我正在創建字符並希望將它們存儲在數組中。當我想存儲第二個字符出現的問題,因爲它覆蓋了第一個數據 - 它似乎像變存儲內容的鏡像,而不是:以swift 4的形式將數據存儲在數組中,但不可修改

代碼在遊樂場:

import UIKit 

class character { 

    var name: String 
    var owner: String 

    init() { 
     name = "Frodo" 
     owner = "Ben" 
    } 
    func random() { 
     name = "Gollum" 
     owner = "Hans" 
    } 
} 

var CharacterArray: [character] = [] 

let testchar = character.init() 

CharacterArray.append(testchar) 

testchar.random() 

CharacterArray.append(testchar) 

當我查看第一個附加數組時,(「Frodo,Ben」)被存儲。當我關注第二次追加時,兩個條目都是(「Gollum」,「Hans」)。

如何確保存儲在數組中的數據是單個值?我相信我在這裏有一個概念錯誤。

請指教。

謝謝!

回答

0

這不是Swift 4的問題,而是Swift中引用和值類型的區別。您可以將您的character從類更改爲結構,您將看到不同之處。

struct MyCharacter { 
    var name: String 
    var owner: String 

    init() { 
     name = "Frodo" 
     owner = "Ben" 
    } 

    mutating func random() { 
     name = "Gollum" 
     owner = "Hans" 
    } 
} 

var myArray: [MyCharacter] = [] 

var csVal = MyCharacter() 
myArray.append(csVal) 
csVal.random() 
myArray.append(csVal) 

for character in myArray { 
    print(character.name) 
} 

還有一件事是你應該大寫Class/Struct名稱的第一個字母,並將變量名的第一個字母改爲小寫。檢查this瞭解Swift名稱約定的更多信息。


如果你仍想保留你的設計,周圍的工作是從你的random函數返回一個新的Character

import UIKit 

class Character { 
    var name: String 
    var owner: String 

    init() { 
     name = "Frodo" 
     owner = "Ben" 
    } 

    init(name: String, owner: String) { 
     self.name = name 
     self.owner = owner 
    } 

    func random() -> Character { 
     return Character(name: "Gollum", owner: "Hans") 
    } 
} 

var characterArray: [Character] = [] 

let testchar = Character() 
characterArray.append(testchar) 
let random = testchar.random() 
characterArray.append(random) 

for character in characterArray { 
    print(character.name) 
} 
+0

哇!感謝驚人的快速幫助!使用「struct」而不是class來解決問題!我在swift 2中編寫的參考代碼雖然將字符定義爲「class」(但由於太多已改變,我無法再執行代碼!)。 –

+0

我更新了我的答案,以防您想保留您的設計,但取決於您的目標,無論如何都應該改進。 – Lawliet

+0

另一件事是你也應該看看在Swift中的命名約定,以求清晰。 – Lawliet

相關問題