Swift 如何快速关闭捕获Int?
想知道swift闭包捕获是如何工作的吗?像Swift 如何快速关闭捕获Int?,swift,closures,Swift,Closures,想知道swift闭包捕获是如何工作的吗?像i值被捕获一样,思想j值也将被捕获,但它不是。有人能解释一下这个i和j是如何被swift closure捕获的吗 var statements = [()->()]() var j = 10 for i in 1...10 { statements.append { print(i) print(j) } } statements[2]() //prints 3 and 10 j = 20 s
i
值被捕获一样,思想j
值也将被捕获,但它不是。有人能解释一下这个i
和j
是如何被swift closure捕获的吗
var statements = [()->()]()
var j = 10
for i in 1...10 {
statements.append {
print(i)
print(j)
}
}
statements[2]() //prints 3 and 10
j = 20
statements[5]() //prints 6 and 20, I was expecting 6 and 10
有问题的闭包捕获对变量
j
的引用,它将使用分配给j
的任何新值。如果不想使用更新后的值,则必须使用以下语法,其中闭包将捕获值(变量j
)而不是引用,并且不会更改
var j = 10
for i in 1...10 {
statements.append { [j] in
print(i)
print(j)
}
}
关于变量
i
和j
范围的注释示例
如果我们将i
作为变量,并在调用闭包之前更改值,它将更改其捕获的值,因为闭包已捕获变量i
的引用,如下所示
var j = 10
for var i in 1...10 {
statements.append { [j] in
print(i)
print(j)
}
if i == 1 {
i = 9999
statements[0]()
}
}
输出
9999
10
1
10
但是如果我们像下面那样捕获i
和j
的值,那么一旦捕获了值,闭包内部就不会发生任何变化
var j = 10
for var i in 1...10 {
statements.append { [i, j] in
print(i)
print(j)
}
if i == 1 {
i = 9999
statements[0]()
}
}
输出
9999
10
1
10
在我的问题中,
i
与j
有何不同?我检查了I
的地址,它在循环的每个迭代中似乎都是相同的地址。那么,为什么它对i
有价值,而对j
有参考价值呢?你能分享一些链接来解释[j]在中的用法吗?@Saran,i
的范围仅限于循环的每次迭代,因此下一次迭代可以使用相同的内存,并将分配新的值,因此每次迭代捕获的值不同。而j
具有全局作用域,闭包将根据使用情况进行操作。有关作用域的详细信息,请查看本文档中的部分。