把价值传递给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(...