如何捕获块的变量的当前值

时间:2016-05-18 13:22:54

标签: ios iphone swift grand-central-dispatch

有没有办法保存变量的当前值以供以后在块中使用?

例如,对于此Playground代码:

import UIKit
import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

class testClass {
    var i = 0
    func test() {
        let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC)) * 5)
        dispatch_after(dispatchTime, dispatch_get_main_queue(), {
            self.test(self.i)
        })
        i = 3
    }

    func test(i: Int)
    {
        print("i: \(i)")
    }
}

let a = testClass()
a.test()

是否可以通过i而不是dispatch_after的方式保存i: 0的{​​{1}}的当前值?

2 个答案:

答案 0 :(得分:4)

您可以将任意表达式绑定到捕获列表中的命名值, 在创建闭包时计算表达式。在你的情况下 你会绑定self.i

dispatch_after(dispatchTime, dispatch_get_main_queue(), { [i = self.i] in
    self.test(i)
})

答案 1 :(得分:3)

由于您通过捕获的i引用了self,因此您将获得调度时的任何值。如果要在函数开头捕获值,则在更改之前需要获取本地副本。

    let x = self.i
    dispatch_after(dispatchTime, dispatch_get_main_queue(), {
        self.test(x)
    })