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

How to capture a variable's current value for a block

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

例如,对于这个 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()

有没有办法为 dispatch_after 保存 i 的当前值,使我得到输出 i: 0 而不是 i: 3

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

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

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

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