2017-07-20 5 views
1

文字を作成していて、配列に格納したいと思います。私は2番目の文字を保存したいとき、それは最初の1のデータが上書きされるため、問題は、発生 - 変数は、コンテンツのミラーの代わりに保存されているように思える:遊び場でクラスデータを、変更できないスウィフト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")が表示されます。 2番目の項目を見てみると、両方の項目が( "ゴラム"、 "ハンス")です。

アレイに格納されたデータが個別の値であることを確認するにはどうすればよいですか?私はここに概念的な誤りがあると信じています。

お知らせください。

ありがとうございます!

答えて

0

これはSwift 4の問題ではなく、Swiftの参照型と値型の違いです。 characterをクラスからstructに変更することができます。違いがわかります。

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) 
} 

もう一つは、あなたが、クラス/構造体名の最初の文字を大文字と小文字にあなたの変数名の最初の文字を変更する必要があります。 Swiftの名前の規則の詳細については、thisを参照してください。


あなたはまだあなたのデザインを維持したい場合は、周りの仕事は、あなたの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

WOW!驚くほど速いヘルプありがとう!クラスの代わりに "struct"を使用すると、問題が解決されます。スウィフト2でプログラミングされた私の参照コードは文字を "クラス"と定義していましたが(あまりにも多くの変更があったためにコードをもう実行できません)。 –

+0

あなたのデザインを維持したい場合に備えて私の回答を更新しましたが、あなたの目標に応じてそれを改善する必要があります。 – Lawliet

+0

別のことは、明快にするためにSwiftの命名規則を見てください。 – Lawliet

関連する問題