objective-c nsarray block swift enumeration

objective c - Cómo detener enumerateObjectsUsingBlock Swift



objective-c nsarray (5)

¿Cómo detengo una enumeración de bloques?

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

Sé que en el obj-c haces esto:

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


Desafortunadamente, esto ha cambiado cada versión importante de Swift. Aquí hay un desglose:

Swift 1

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

Swift 2

stop.memory = true

Swift 3

stop.pointee = true


Desde XCode6 Beta4 , se puede utilizar la siguiente forma:

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


En Swift 1:

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

En Swift 2:

stop.memory = true

En Swift 3 - 4:

stop.pointee = true


La respuesta aceptada es correcta pero solo funcionará para NSArrays. No para la Array datos Swift. Si lo desea puede recrearlo con una extensión.

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

llámalo como

[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 para la función con un bloque como el último parámetro que puedes hacer

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


Solo stop = true

Como stop se declara inout, swift se encargará de mapear la dirección indirecta para usted.