2016-07-26 9 views
2

Ich habe eine for-Schleife, die über jedes Element in einem Array läuft. Unter einer bestimmten Bedingung füge ich dem Array innerhalb der Schleife ein weiteres Element hinzu. Die Schleife berücksichtigt dieses neue Element jedoch nicht. Wenn es ursprünglich 6 Elemente im Array gibt und während des Durchschleifens, füge ich 2 weitere hinzu, es werden nur noch 6 Schleifen wiederholt. Wie kann ich das beheben?Element zu einem Array hinzufügen, während darüber iteriert wird

for ingredient in ingredientList { 
    if ingredient.name == "banana" { 
     var orange = Ingredient(name: "orange") 
     ingredientList.append(orange) 
    } 
    if ingredient.name == "orange" { 
     // this never executes 
    } 
} 

Wenn einer meiner Zutaten eine Banane ist, fügen Sie eine Orange zur Liste hinzu. Die Schleife berücksichtigt jedoch nie das neu hinzugefügte Element. Wie kann ich so etwas erreichen und warum funktioniert es nicht?

Antwort

2

versuchen Sie dies:

var array = ["a", "b"] 

for i in array.startIndex...array.endIndex { 
    if array[i] == "b" { 
     array.append("c") 
     print("add c") 
    } 
    if array[i] == "c"{ 
     array.append("d") 
     print("add d") 
    } 
} 
1

Ich denke, es gibt zwei Probleme hier:

  1. Generell sollten Sie nicht eine Sammlung ändern, während sie aufzuzählen. Im besten Fall wird es dich ignorieren. In den meisten Sprachen wird es einfach abstürzen.

  2. Ich vermute, was Sie hier sehen, ist, dass Ihre Schleife mit einer Kopie der Sammlung arbeitet, aber Ihr "append" das Original verändert. Meine Schlussfolgerung dort ist, dass in Swift Strukturen eher Kopien als Referenzen sind, und seltsam genug ... Arrays und Wörterbücher sind Strukturen.

0

Sie müssen stattdessen für jede Schleife einer for-Schleife verwenden, und der Zähler entsprechend anpassen, wenn

Int cntVar = 0 

for x as Integer = 0 to ingredientList.count - 1 { 
    if ingredientList(x + cntVar).name == "banana" { 
     var orange = Ingredient(name: "orange") 
     ingredientList.append(orange) 
     x = x - 1 
     cntVar = cntVar + 1 
    } 
    if ingredientList(x + cntVar).name == "orange" { 
     //add needed function here 
    } 
} 
0

@ghostatron eine Sammlung von Indizes Hinzufügen eines Elements Eigenschaft einer starken Bezug auf die Sammlung aufnehmen kann selbst, wodurch die Sammlung nicht eindeutig referenziert wird. Wenn Sie die Sammlung während der Iteration über ihre Indizes mutieren, kann eine starke Referenz eine unerwartete Kopie der Sammlung verursachen. Um die unerwartete Kopie zu vermeiden, verwenden Sie die index (after :) -Methode, die mit startIndex beginnt, um stattdessen Indizes zu erzeugen.

var c = MyFancyCollection([10, 20, 30, 40, 50]) 
var i = c.startIndex 
while i != c.endIndex { 
    c[i] /= 5 
    i = c.index(after: i) 
} 
// c == MyFancyCollection([2, 4, 6, 8, 10]) 
Verwandte Themen