如何为块捕获变量的当前值
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)
})
有没有办法保存变量的当前值以供以后在块中使用?
例如,对于这个 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)
})