If you use any external values inside your closure, Swift captures them – stores them alongside the closure, so they can be modified even if they don’t exist any more.
Right now we have a travel()
function that returns a closure, and the returned closure accepts a string as its only parameter and returns nothing:
func travel() -> (String) -> Void {
return {
print("I'm going to \($0)")
}
}
We can call travel()
to get back the closure, then call that closure freely:
let result = travel()
result("London")
Closure capturing happens if we create values in travel()
that get used inside the closure. For example, we might want to track how often the returned closure is called:
func travel() -> (String) -> Void {
var counter = 1
return {
print("\(counter). I'm going to \($0)")
counter += 1
}
}
Even though that counter
variable was created inside travel()
, it gets captured by the closure so it will still remain alive for that closure.
So, if we call result("London")
multiple times, the counter will go up and up:
result("London")
result("London")
result("London")
SPONSORED Join a FREE crash course for mid/senior iOS devs who want to achieve an expert level of technical and practical skills – it’s the fast track to being a complete senior developer! Hurry up because it'll be available only until April 28th.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.