Swift 1.0 or later
下面的代码输出是什么?并说明理由。
1 2 3 4 5 6 7 8 9 | var thing = "cars" let closure = { [thing] in print("I love \(thing)") } thing = "airplanes" closure() |
输出的是:I love cars。当闭包被声明的时候,抓捕列表就复制一份thing变量,所以被捕捉的值并没有改变,即使你给thing赋了一个新值。
如果你要忽视闭包中捕捉列表的值,那么编译器引用那个值而不是复制。这种情况下,被引用变量的值的变化将会反映到闭包中,正如下面的代码所示: