把价值传递给closures?
我想在处理最后一个项目之后做额外的逻辑,但是terminal显示i
总是和c
一样的值。 任何想法如何传递循环variables?
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 } }) }) }
你可以用闭包中的捕获列表 [i]
显式地捕获 i
的值,那么你就不需要把它复制到一个单独的variables中。 例:
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)") }) }) }
输出:
我0 c 5 我1 c 5 我2 c 5 我3 c 5 我4 c 5
在执行closures时,for循环已经完成,并且i
= c
。 在for循环中需要一个辅助variables:
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 } }) }) }
你需要声明一个variables(而不是迭代variables)来获得正确的范围,例如
for var _i=0; _i<c; _i++ { let i = _i dispatch_async(...