var array = [() -> ()]()
var count = 0
var index = 0
while index < 5 {
array.append {
print("count: (count)")
print("index: (index)")
}
count += 1
index += 1
}
array[0]()
array[4]()
输出:
计数:5
索引:5
计数:5
索引:5
相同的情况,但有一些变化:
var array = [() -> ()]()
var count = 0
for index in 0..<5 {
array.append {
print("count: (count)")
print("index: (index)")
}
count += 1
}
array[0]()
array[4]()
输出:
计数:5
索引:0
计数:5
索引:4
Count
值在两种情况下都是相同的,因为我们没有明确捕获它,即5
- 在第一种情况下,使用全局
index
变量,结果是最后一个增量值,即5和5 - 在第二种情况下,使用循环的
index
,并且值分别为0和4
确切的区别是什么?
在第一个示例中,index
是var
声明的,并且每次使用的变量相同,在第二个示例中是let
声明的,因此在第二示例中,它是index
的新实例,存在于每次迭代的for
循环的范围中
我调试了那个代码,因为它看起来有点奇怪,但我告诉你,追加和增量行运行得很好,当你调用array0和array4时,调试器会转到append{}的主体并打印这些变量。并从最容易访问的范围捕获这些变量。因此,在第一种情况下,它将从函数体的范围中捕获count和index的新值5和5。
在第二种情况下,它将尝试捕获是否初始化了变量计数和索引,它会找到计数,但找不到,所以它会检查数组的内部,在那里它会找到实际值,第一个索引为0,第五个索引为4。
这就是我所能解释的,对不起英语不好
检查此处的调试器图像