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)
更多。在这个主题上缺乏明确的指导(对于一个经常使用的模式来说)有点令人沮丧。