2014-06-13 20 views
22

Wie kann ich eine Blockaufzählung stoppen?So stoppen Sie enumerateObjectsUsingBlock Swift

myArray.enumerateObjectsUsingBlock({ object, index, stop in 
     //how do I stop the enumeration in here?? 
    }) 

ich in obj-c wissen Sie, dies zu tun:

[myArray enumerateObjectsUsingBlock:^(id *myObject, NSUInteger idx, BOOL *stop) { 
     *stop = YES; 
    }]; 
+0

möglich Duplikat [enumerateObjectsUsingBlock in Swift] (http://stackoverflow.com/questions/24120115/enumerateobjectsusingblock-in-swift) –

+0

Der Link im Grunde sagt, nicht verwenden enumerateObjectsUsingBlock in swift, da die Funktionalität besser mit 'for ... in .. enumerate' ausgedrückt wird –

+4

@David: kein Duplikat. Der andere Thread deckt den Stopp-Parameter nicht ab. – vikingosegundo

Antwort

9
stop.withUnsafePointer { p in p.memory = true } 

In Swift 2

stop.memory = true 
+0

Heilige FSM, warum ist das so schwer zu tun? Ich nehme an, weil du nicht annehmen solltest, 'enumerateObjectsUsingBlock' zu verwenden, aber' for' crap – random

+2

Weil sie einige der schrecklichen Sachen von Objective-C in Swift überbrücken – hypercrypt

+0

Weil Apple jetzt 'for (index, value) in array.enumerate empfiehlt () 'stattdessen, die den Block und den Anschlag vollständig beseitigt, während Duplizierung genau die gleiche Funktionalität viel deutlicher. –

-2

Gerade stop = true

Seit Anschlag als inout deklariert ist, schnell für Sie kümmern sich die Indirektheit abzubilden.

+6

'Kann 'Let' Wert 'Stop' nicht zuweisen – random

+0

Diese Information ist veraltet – ctietze

+0

Verwenden Sie' stop.memory = true' –

7

Die akzeptierte Antwort ist richtig, aber nur für NSArrays arbeiten. Nicht für den Swift-Datentyp Array. Wenn Sie möchten, können Sie es mit einer Erweiterung neu erstellen.

extension Array{ 
    func enumerateObjectsUsingBlock(enumerator:(obj:Any, idx:Int, inout stop:Bool)->Void){ 
     for (i,v) in enumerate(self){ 
      var stop:Bool = false 
      enumerator(obj: v, idx: i, stop: &stop) 
      if stop{ 
       break 
      } 
     } 
    } 
} 

nennen es wie

[1,2,3,4,5].enumerateObjectsUsingBlock({ 
    obj, idx, stop in 

    let x = (obj as Int) * (obj as Int) 
    println("\(x)") 

    if obj as Int == 3{ 
     stop = true 
    } 
}) 

oder für die Funktion mit einem Block als letzter Parameter können Sie tun

[1,2,3,4,5].enumerateObjectsUsingBlock(){ 
    obj, idx, stop in 

    let x = (obj as Int) * (obj as Int) 
    println("\(x)") 

    if obj as Int == 3{ 
     stop = true 
    } 
} 
+0

Stop = True funktioniert nicht in Beta 3 FYI – nsdebug

+1

es funktioniert meine Maschine. mit Beta 3. – vikingosegundo

20

seit XCode6 Beta4, kann die folgende Art und Weise statt dessen verwendet werden :

let array: NSArray = // the array with some elements... 

array.enumerateObjectsUsingBlock({ (object: AnyObject!, idx: Int, stop: UnsafePointer<ObjCBool>) -> Void in 

     // do something with the current element... 

     var shouldStop: ObjCBool = // true or false ... 
     stop.initialize(shouldStop) 

     }) 
+4

Ich war dabei, eine Antwort zu posten, die bemerkte, dass "stop [0] = true" funktionierte, aber ich denke, ich mag 'stop.initialize (true)' more. Das Fehlen einer klaren Anleitung zu diesem Thema (für ein Muster, das häufig verwendet wird) ist ein wenig frustrierend. – Rob

25

Dies hat leider jede größere Version von Swift geändert. Hier ist eine Aufschlüsselung:

Swift 1

stop.withUnsafePointer { p in p.memory = true } 

Swift 2

stop.memory = true 

Swift 3

stop.pointee = true 
+5

lol swift 4: 'stop.pointeee = wahr ' – random

0

In Swift 3.x

nennen es wie

((name ofarray) as NSArray).enumerateObjects({ 
      obj, idx, stop in 
    .... // you can check your condition here and stop enumeration in condition.. 
})