提问人:Deepal 提问时间:3/26/2022 更新时间:3/26/2022 访问量:125
Swift:捕获列表
Swift: Capture list
问:
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
- 在第一种情况下,使用全局变量,结果是最后一个递增值,即 5 和 5
index
- 在第二种情况下,使用 for 循环,值分别为 0 和 4。
index
确切的区别是什么?
答:
2赞
Joakim Danielson
3/26/2022
#1
在第一个示例中声明了它,并且每次都使用相同的变量,在第二个示例中,它被声明,因此在第二个示例中,它是存在于每次迭代的循环范围内的新实例index
var
let
index
for
评论
0赞
Deepal
3/26/2022
在第一种情况下,如果我们捕获 那么它会给出与第二种情况相同的结果。index
array.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。
这就是我能解释的,对不起,英语不好
评论