Подтвердить что ты не робот

Как остановить enumerateObjectsUsingBlock Swift

Как остановить перечисление блоков?

    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;
    }];
4b9b3361

Ответ 1

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

В Swift 2

stop.memory = true

Ответ 2

Это, к сожалению, изменило каждую основную версию Swift. Здесь разбивка:

Swift 1

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

Swift 2

stop.memory = true

Swift 3

stop.pointee = true

Ответ 3

так как 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)

        })

Ответ 4

Принятый ответ правильный, но будет работать только для 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
    }
}

Ответ 5

В Swift 3.x

назовите его как

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

Ответ 6

Просто stop = true

Так как stop объявлен как inout, swift позаботится о отображении косвенности для вас.