typealias IntMaker = (Void)->Int
func makeCounter() ->IntMaker{
var n = 0 // Line A
func adder()->Integer{
n = n + 1
return n
You've called makeCounter()
once. That creates your new closure, and assigns it to counter1
. This closure closes over the mutable var n
, and will remain captured as long as this closure exists.
Calling counter1()
will execute it, but it retains the same captured n
, and mutates it. This particular "adder" will ALWAYS capture this same n
, so long as it exists..
To get the behavior you're suggesting, you need to make new closures which capture new instances of n
:
let counter1 = makeCounter()
counter1() // returns 1
counter1() // returns 2
counter1() // returns 3
var counter2 = makeCounter()
counter2() // returns 1
counter2 = makeCounter()
counter2() // returns 1
counter2 = makeCounter()
counter2() // returns 1
Now both counter1
and counter2
each have their own separate instances of n
.