swift - 快速关闭如何捕获 Int?
问题描述
想知道快速关闭捕获是如何工作的吗?就像i
价值被捕获一样,思想j
价值也会被捕获,但事实并非如此。有人可以解释一下这是如何被迅速关闭的吗i
?j
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
但是,如果我们如下捕获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]()
}
}
输出
1
10
推荐阅读
- c# - 来自 API 的多种返回类型
- json - Google Cloud Text-to-Speech 返回“INVALID_ARGUMENT”
- java - 如何在 Android 9 上制作应用程序支持
- pyspark - 属性错误:“datetime.timedelta”对象没有属性“_get_object_id”
- php - 如何使唯一数组的自定义验证规则依赖于其他字段 laravel
- java - 如何使用 JDBCIO (apache beam) 执行存储过程/例程
- javascript - 更新提交事件中的值后未提交隐藏输入
- php - 表中每一行的非法字符串偏移 'Data_length'/'Index_length'
- c# - C#计算器 - 不能在小数点前插入数字
- python - 如何对分支 python 版本有 100% 的覆盖率?