2016-04-01 20 views
0

Ich muss ein grundlegendes Missverständnis haben, wie die Flusssteuerung in Swift funktioniert, weil dies für mich keinen Sinn ergibt.For-Schleife wird nicht ausgeführt, wenn ich eine innere Schleife hinzufüge

//objects is of type [AnyObject]? 
for obj in objects!{ 
    let colors = obj.valueForKey("colors") as? NSMutableArray 
    if colors != nil{ 
     for i in 0...colors!.count{ 
      if colors![i] as? String != nil{ 
       colors![i] = (colors![i] as! String).capitalizedString 
      } 
     } 
     obj.setValue(colors, forKey: "colors") 
    } 
    obj.save() 
}//end for 

Wenn ich die innere for-Schleife zu entfernen, funktioniert die äußere normalerweise, aber wenn ich die innere Schleife hinzufügen, es wird nie über die erste Iteration der äußeren Schleife. Es gibt keine Abstürze oder irgendetwas - alles andere wird normal fortgesetzt.

Ich verstehe nicht, warum das passiert. Bin ich nur dicht und vermisse etwas Offensichtliches?

Alternativ könnte ich wahrscheinlich einfach eine Map-Funktion schreiben, um die Strings in meinem Array groß zu schreiben, aber ich möchte verstehen, warum dies nicht funktioniert.

+2

Können Sie Beispieleingabe mit unerwartetem Verhalten geben? – Eiko

+0

Sie sagen, es gibt keinen Absturz, aber es gibt einen offensichtlichen Fehler in '0 ... colors! .count', der bei einem Absturz enden muss. Ihre Antwort schlägt vor, das Problem zu beheben, so dass ich mir ziemlich sicher bin, dass es einen Absturz gab. – Sulthan

+0

@Sulthan Ich dachte es auch ... aber es scheint auf Spielplatz gespielt zu haben - bis ich bemerkte, dass ich Swift Arrays und nicht NSMutableArray verwendete - also wurde die Schleife nie ausgeführt (Farben = Null). Also ja, es ist offensichtlich falsch. :) – Eiko

Antwort

-1

Ich habe noch nicht swift verwendet, aber in Bezug auf verschachtelte Schleifen. Wie lange haben Sie gewartet, bevor Sie festgestellt haben, dass die äußere Schleife die erste Iteration nicht überstehen wird?

Wenn Sie zum Beispiel über 10 Millionen Farben in der verschachtelten Schleife loopen, würde das eine Weile dauern.

Oder müssen Sie den Iterator in der Nested-Schleife inkrementieren und er läuft derzeit als Endlosschleife?

-1

ich es behoben, indem die innere for-Schleife Wechsel von:

for i in 0...colors!.count{} 

zu

for i in 0...colors!.count - 1{} 

Aber ich habe keine Ahnung, warum die ehemalige die Schleife zu brechen verursacht wurde. Selbst wenn ich alles aus der inneren Schleife entfernte, hatte es immer noch das gleiche Problem. Wenn jemand weiß, warum das passiert ist, lass es mich wissen.

+0

Eine bessere Lösung wäre 'für i in 0 .. Sulthan

1

Ein einfaches Beispiel demonstriert das Problem:

let array: NSMutableArray = ["a", "b", "c"] 

for i in 0...array.count { 
    print("Index: \(i)") 
    print("Item: \(array[i])") 
} 

Drucke:

Index: 0 
Item: a 
Index: 1 
Item: b 
Index: 2 
Item: c 
Index: 3 
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 

Statt 0...array.count Sie 0..<array.count, als eine noch bessere Alternativen verwendet werden soll, sollten Sie das Array in einen Swift werfen Array zuerst und dann verwenden Sie die leistungsstärkeren for-in Varianten.

Ein einfaches Beispiel:

let array: NSMutableArray = ["a", "b", "c", 10, 20] 

let colors = array as [AnyObject] 
let newColors = colors.filter { $0 is String } 
         .map { ($0 as! String).capitalizedString } 

print(newColors) 

Natürlich müssen Sie zunächst das Konzept der änderbaren Arrays lassen.