2014-06-13 16 views
22

Come si interrompe l'enumerazione dei blocchi?Come arrestare enumerateObjectsUsingBlock Swift

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

conosco in obj-c si esegue questa operazione:

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

possibile duplicato di [enumerateObjectsUsingBlock a Swift] (http://stackoverflow.com/questions/24120115/enumerateobjectsusingblock-in-swift) –

+0

Il collegamento dice in sostanza, non usare enumerateObjectsUsingBlock in swift, perché la funzionalità è meglio espressa usando 'for ... in .. enumerate' –

+4

@David: non un duplicato. l'altro thread non copre il parametro stop. – vikingosegundo

risposta

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

In Swift 2

stop.memory = true 
+0

Holy FSM, perché è così difficile da fare? Immagino perché non supponiamo di usare 'enumerateObjectsUsingBlock' ma' for' crap – random

+2

Perché stanno collegando alcune delle cose orribili da Objective-C a Swift – hypercrypt

+0

Perché Apple ora raccomanda di usare 'for (index, value) in array.enumerate () invece, che elimina completamente il blocco e lo stop, duplicando esattamente la stessa funzionalità molto più chiaramente. –

-2

Proprio stop = true

Dal arresto è dichiarato come inout, veloce si occuperà della mappatura del indirezione per voi.

+6

'Impossibile assegnare 'let' valore 'stop'' – random

+0

Queste informazioni non sono aggiornate – ctietze

+0

Utilizzare' stop.memory = true' –

7

La risposta accettata è corretto, ma funzionerà solo per NSArrays. Non per il tipo di dati Swift Array. Se ti piace, puoi ricrearlo con un'estensione.

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

chiamata piace

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

o per la funzione con un blocco come ultimo parametro si può fare

[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 non funziona in beta 3 FYI – nsdebug

+1

lo fa su la mia macchina con beta 3. – vikingosegundo

20

dal XCode6 Beta4, nel seguente modo può essere usato al posto :

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

Stavo per pubblicare una risposta che diceva che 'stop [0] = true' funzionava, ma penso che mi piace' stop.initialize (true) 'di più. La mancanza di una guida chiara su questo argomento (per uno schema che viene usato molto) è un po 'frustrante. – Rob

25

Questo ha purtroppo cambiato tutte le versioni principali di Swift. Ecco la ripartizione:

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 = true' – random

0

In 3.x Swift

chiamano come

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