通过价值关闭?

Ján*_*nos 5 block ios swift

我想在处理i完最后一个项目之后做额外的逻辑,但是终端显示的值始终与之相同c.知道如何传递循环变量吗?

let c = a.count
for var i=0; i<c; i++ {

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {

        // ..

        dispatch_async(dispatch_get_main_queue(), {

            println("i \(i) c \(c)")
            if i == c-1 {

                // extra stuff would come here
            }
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

Glo*_*del 6

执行闭包时,for循环已经完成并且i= c.在for循环中需要一个辅助变量:

let c = a.count
for var i=0; i<c; i++ {
    let k = i
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {

        // ..

        dispatch_async(dispatch_get_main_queue(), {

            println("k \(k) c \(c)")
            if k == c-1 {

                // extra stuff would come here
            }
        })
    })
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*n R 6

您可以i使用 闭包中的捕获列表 显式捕获值[i],然后您无需将其复制到单独的变量中.例:

let c = 5
for var i=0; i<c; i++ {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
        [i] in   // <===== Capture list
        dispatch_async(dispatch_get_main_queue(), { 

            println("i \(i) c \(c)")
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

输出:

i 0 c 5
i 1 c 5
i 2 c 5
i 3 c 5
i 4 c 5