Reputation: 21137
Is there a way to save the current value of a varible for later usage in a block?
For example, for this Playground code:
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()
Is there a way to save the current value of i
for dispatch_after
in a way that I get the output i: 0
instead of i: 3
?
Upvotes: 2
Views: 141
Reputation: 539705
You can bind an arbitrary expression to a named value in a capture list,
the expression is evaluated when the closure is created. In your case
you would bind self.i
:
dispatch_after(dispatchTime, dispatch_get_main_queue(), { [i = self.i] in
self.test(i)
})
Upvotes: 4
Reputation: 31016
Since you're referencing i
through a captured self
, you will get whatever the value is at dispatch time. If you want to capture the value as it is at the beginning of the function, you'll need to get a local copy before changing it.
let x = self.i
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
self.test(x)
})
Upvotes: 3