Ответ 1
stop.withUnsafePointer { p in p.memory = true }
В Swift 2
stop.memory = true
Как остановить перечисление блоков?
myArray.enumerateObjectsUsingBlock( { object, index, stop in
//how do I stop the enumeration in here??
})
Я знаю в obj-c вы это делаете:
[myArray enumerateObjectsUsingBlock:^(id *myObject, NSUInteger idx, BOOL *stop) {
*stop = YES;
}];
stop.withUnsafePointer { p in p.memory = true }
В Swift 2
stop.memory = true
Это, к сожалению, изменило каждую основную версию Swift. Здесь разбивка:
Swift 1
stop.withUnsafePointer { p in p.memory = true }
Swift 2
stop.memory = true
Swift 3
stop.pointee = true
так как XCode6 Beta4 может использоваться следующим образом:
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)
})
Принятый ответ правильный, но будет работать только для NSArrays. Не для типа данных Swift Array
. Если вам нравится, вы можете воссоздать его с расширением.
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
}
}
}
}
назовите его как
[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
}
})
или для функции с блоком в качестве последнего параметра, который вы можете сделать
[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
}
}
В Swift 3.x
назовите его как
((name ofarray) as NSArray).enumerateObjects({
obj, idx, stop in
.... // you can check your condition here and stop enumeration in condition..
})
Просто stop = true
Так как stop объявлен как inout, swift позаботится о отображении косвенности для вас.