Objective c 如何使用Block Swift停止枚举对象
如何停止块枚举Objective c 如何使用Block Swift停止枚举对象,objective-c,nsarray,block,swift,enumeration,Objective C,Nsarray,Block,Swift,Enumeration,如何停止块枚举 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 =
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=true
由于stop被声明为inout,swift将负责为您映射间接寻址。在swift 1中:
stop.withUnsafePointer { p in p.memory = true }
在Swift 2中:
stop.memory = true
在Swift 3-4中:
stop.pointee = true
公认的答案是正确的,但仅适用于NSArray。不适用于Swift数据类型
数组
。如果您愿意,可以使用扩展重新创建它
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
}
}
由于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)
})
let-array:NSArray=//包含某些元素的数组。。。
enumerateObjectsUsingBlock({(对象:AnyObject!,idx:Int,stop:UnsafePointer)->中的Void
//对当前元素执行某些操作。。。
var shouldStop:ObjCBool=//true或false。。。
停止。初始化(shouldStop)
})
不幸的是,这改变了Swift的每个主要版本。下面是一个细分:
Swift 1
stop.withUnsafePointer { p in p.memory = true }
Swift 2
stop.memory = true
Swift 3
stop.pointee = true
无法指定'let'value'stop'
使用stop.memory=true
链接的可能重复项基本上是说,不要在swift中使用EnumerateObjectsSusingBlock,因为使用对于。。。在里面枚举
@David:不是重复的。另一个线程没有包含stop参数。是的,答案是关于如何用新语法替换旧调用以及如何尽早停止调用。如果要求我们给出关于特定api的答案,那么给出另一个选项可能会有所帮助,但从技术上讲,这不是答案。只有一种意见。如果你在数学考试中被要求用泰勒公式计算某个函数,但你却用傅里叶公式,因为你认为无论出于什么原因它都比泰勒公式好,那就是完全失败。如果OP需要/想要使用EnumerateObjectsSusingBlock
,我们不应该强迫他使用其他东西。虽然我们应该提到一个更好的方法。神圣的FSM,为什么这么难做到?我猜是因为你不打算使用EnumerateObjectsSusingBlock
而是for
crap,因为他们将Objective-C中的一些可怕的东西连接到了Swift中,因为苹果现在建议在数组中使用for(index,value)。enumerate()
,这样就完全消除了块和停止,同时更清晰地复制完全相同的功能。如果可以,您应该使用Array,而不是NSArray,以及myArray-语法中obj的。@david:enumerate是一个全局函数,不是数组上的方法。它被称为enumerate(array)
它在我的机器上运行。对于beta 3。@VyachaslavGerchicov,我想你的问题是:“如果它不起作用,为什么会被提高投票率?”。嗯,四年前是这样的。斯威夫特经历了几次不兼容的变化。无法修复它。@vikingosegundo无法将值赋值:“stop”是一个“let”常量
。我找到的最简单的解决方案是stop.initialize(to:true)
。你知道一个更好的方法吗?我正要发布一个答案,指出stop[0]=true
有效,但我想我喜欢stop.initialize(true)
更多。在这个主题上缺乏明确的指导(对于一个经常使用的模式来说)有点令人沮丧。