2017-07-27 17 views
1

動作しない、私はプロジェクトを働いていると、このようなループの中で用を反復処理するときに、このエラーに遭遇していますスウィフトのためにカスタムクラスの配列を反復処理する

class CustomClass { 

    var nameNum : Int { didSet { self.name = "CustomClass \(nameNum)" } } 
    var name : String 

    init() { 
     nameNum = 0 
     self.name = "CustomClass \(nameNum)" 
    } 
} 

var myArray : [CustomClass] = [CustomClass](repeating: CustomClass(), count: 5) 

for _class in myArray.indices { 
    myArray[_class].nameNum = _class 
} 

print("\n") 
for _class in myArray.indices { 
    print("Item \(_class): \(myArray[_class].name)") 
} 

私は次の取得出力:

アイテム0:CustomClass 4

項目1:CustomClass 4

アイテム2:CustomClass 4

項目3:CustomClass 4

項目4:CustomClass私は、私が代わりに次のような出力になるだろうと思ったので、これは私には意味がありません4

項目を0 :CustomClass 0

アイテム1:CustomClass 1

項目2:CustomClass 2

項目3:CustomClass 3

項目4:CustomClass 4

これが動作しない理由として、あるいはそれが評価されて固定に取り掛かる方法に任意のヘルプ、ありがとう!

+0

'_class'は第2ループの誤解を招く名前です。それは実際にはインデックス – Alexander

+1

です:https://stackoverflow.com/questions/32921425/swift-creating-an-array-with-a-default-value-of-distinct-object-instances –

+0

ありがとう@MartinRそれを説明するのを助ける私に。 – grahamcracker1234

答えて

1

あなたはから

var myArray : [CustomClass] = (0..<5).map { _ in CustomClass() } 

にあなたの配列の初期化を変更する必要があります

var myArray : [CustomClass] = [CustomClass](repeating: CustomClass(), count: 5) 

完全なコード:

class CustomClass { 

    var nameNum : Int { didSet { self.name = "CustomClass \(nameNum)" } } 
    var name : String 

    init() { 
     nameNum = 0 
     self.name = "CustomClass \(nameNum)" 
    } 
} 

var myArray : [CustomClass] = (0..<5).map { _ in CustomClass() } 

for _class in myArray.indices { 
    myArray[_class].nameNum = _class 
} 

print("\n") 
for _class in myArray.indices { 
    print("Item \(_class): \(myArray[_class].name)") 
} 

理由あなたのコードは、実際のインスタンスを作成することですCustomClassとそれをすべて5 inde配列のxes CustomClassの5つの異なるインスタンスを期待しているところで。 CustomClass 0

項目1:CustomClass 1

同じインスタンスが5回追加されている場合は、それらのすべてがあなたのケースで4

項目0で最後に設定された値を持つことになります項目2:CustomClass 2

項目3:CustomClass 3

項目4:CustomClass 4

+0

これは完璧に動作します、ありがとうございます。 – grahamcracker1234

+0

聞いてよかったです。 – adev

1

nameNumをイニシャライザで0に設定しているのはなぜですか?すぐに変更する場合はどうしたらいいですか?ただ、操作を組み合わせる:nameは常にnameNumから得られた値を持っている場合

class CustomClass { 
    var nameNum: Int 
    var name: String { return "CustomClass \(nameNum)" } 

    init(nameNum: Int) { 
     self.nameNum = nameNum 
    } 
} 

var myArray = (0..<5).map(CustomClass.init(nameNum:)) 

for (index, element) in myArray.enumerated() { 
    print("Item #\(index): \(element.name)") 
} 

はまた、それは、それはそのnameNum由来、むしろそれを設定する責任を持つよりに落ちる計算されたプロパティも持っている方が良いでしょうnameNumを設定する副作用。

+0

ありがとうございます。 – grahamcracker1234

関連する問題