When not using a capture list, Swift closures always refer to variables, not to 
their values. So here you’re not capturing copies, you’re capturing the actual 
variable ‘test’, and the mutating function will update it. (If you did capture 
a copy, it would be immutable, and the call to ‘newNum(new:)’ would be 
rejected.)

On top of that, ‘test’ is a top-lovel variable, so it doesn’t even need to be 
captured at all. The closures can just refer to it globally.

Hope that clears things up. There are some more examples of this 
<https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID544>
 in the Swift Programming Language book.

Jordan


> On Nov 30, 2016, at 02:38, Седых Александр via swift-users 
> <swift-users@swift.org> wrote:
> 
> Assume we have this code:
>  
> Immediately two Timer's closures captured two copy of initial values of 
> instance Test, with internal num values is 0.
>  
> //: Playground - noun: a place where people can play
>  
> import UIKit
>  
> var str = "Hello, playground"
>  
> struct Test {
>     var num = 0
>     mutatingfunc newNum(new: Int) {
>         num = new
>     }
> }
>  
> var test = Test()
>  
> Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in
>     print("tick")
>     test.newNum(new: 8)
> }
>  
> Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { (timer) in
>     print("tack, test.num = \(test.num)")
> }
>  
>  
> CFRunLoopRun()
> 
> 
> 
> We have next log:
> tick
> tack, test.num = 8
>  
> Why Timer's two closure return to us value 8 and not 0?
> 
> 
> 
> -- 
> Седых Александр
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to