Swift:捕获列表

Swift: Capture list

提问人:Deepal 提问时间:3/26/2022 更新时间:3/26/2022 访问量:125

问:

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. 在第一种情况下,使用全局变量,结果是最后一个递增值,即 5 和 5index
  2. 在第二种情况下,使用 for 循环,值分别为 0 和 4。index

确切的区别是什么?

arrays swift closures capture-list

评论


答:

2赞 Joakim Danielson 3/26/2022 #1

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

评论

0赞 Deepal 3/26/2022
在第一种情况下,如果我们捕获 那么它会给出与第二种情况相同的结果。indexarray.append { [index] in }
1赞 Sweeper 3/26/2022
@Deepal 还有......?这与这个答案所说的有什么不同?
0赞 Hashim Khan 3/26/2022 #2

我调试了该代码,因为它看起来有点奇怪,但让我告诉你,追加和增量行进展顺利,当您调用 array0 和 array4 时,调试器会转到 append{} 的正文并打印这些变量。并从最容易访问的范围内捕获这些变量。因此,在第一种情况下,它将从函数体的作用域中捕获哪些值实际上是 count 和 index 的新值 5 和 5。

在第二种情况下,如果初始化了变量计数和索引,它将尝试捕获计数,但不会找到,因此它将检查数组的主体内部,并在那里找到第一个索引中的实际值为 0,在第 5 个索引中为 4。

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

在此处检查调试器映像