2017-07-27 8 views
1

Je travaille un projet et ont rencontré cette erreur lorsque itérer une boucle dans comme ceci:Swift Pour en boucle Itère un tableau des classes personnalisées ne fonctionne pas

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

Je reçois le texte suivant sortie:

Point 0: CustomClass 4

Point 1: CustomClass 4

Point 2: CustomClass 4

Point 3: CustomClass 4

Point 4: CustomClass 4

Cela ne me fait pas sens que je pensais que je recevrais la sortie suivante à la place:

Point 0 : CustomClass 0

Article 1: CustomClass 1

Point 2: 2 CustomClass

Point 3: CustomClass 3

Point 4: CustomClass 4

Toute aide à pourquoi cela ne fonctionne pas ou comment s'y prendre pour le fixer est apprécié , Merci!

+0

'_class' est un nom trompeur dans la deuxième boucle. C'est en fait un index – Alexander

+1

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

+0

Merci @MartinR qui aide à l'expliquer pour moi. – grahamcracker1234

Répondre

1

Vous devez changer votre initialisation de tableau à

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

de

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

code complet:

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

La raison en est que votre code, crée en fait une instance de CustomClass et l'ajoute à tous 5 inde xes de tableau où vous attendez 5 instance différente de CustomClass. Si la même instance est ajouté 5 fois, puis tous auront la dernière valeur de consigne qui dans votre cas est 4.

Article 0: CustomClass 0

Point 1: CustomClass 1

Point 2: CustomClass 2

Point 3: CustomClass 3

Point 4: CustomClass 4

+0

Cela fonctionne parfaitement, merci beaucoup. – grahamcracker1234

+0

C'est bon d'entendre ça. – adev

1

Pourquoi définissez-vous nameNum à 0 dans l'initialiseur, si vous allez immédiatement le changer?Il suffit de combiner les opérations:

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

De plus, si name a toujours une valeur dérivée de nameNum, alors il est préférable d'avoir ce soit une propriété calculée dont la dérivée de nameNum, plutôt que d'avoir la responsabilité de la mise en tomber à un effet secondaire du réglage nameNum.

+0

Merci +1 pour les opérations combinées – grahamcracker1234