Swift:捕获列表


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

  1. 在第一种情况下,使用全局index变量,结果是最后一个增量值,即5和5
  2. 在第二种情况下,使用循环的index,并且值分别为0和4

确切的区别是什么?

在第一个示例中,indexvar声明的,并且每次使用的变量相同,在第二个示例中是let声明的,因此在第二示例中,它是index的新实例,存在于每次迭代的for循环的范围中

我调试了那个代码,因为它看起来有点奇怪,但我告诉你,追加和增量行运行得很好,当你调用array0和array4时,调试器会转到append{}的主体并打印这些变量。并从最容易访问的范围捕获这些变量。因此,在第一种情况下,它将从函数体的范围中捕获count和index的新值5和5。

在第二种情况下,它将尝试捕获是否初始化了变量计数和索引,它会找到计数,但找不到,所以它会检查数组的内部,在那里它会找到实际值,第一个索引为0,第五个索引为4。

这就是我所能解释的,对不起英语不好

检查此处的调试器图像

相关内容

  • 没有找到相关文章

最新更新