Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何快速关闭捕获Int?_Swift_Closures - Fatal编程技术网

Swift 如何快速关闭捕获Int?

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

想知道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

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
具有全局作用域,闭包将根据使用情况进行操作。有关作用域的详细信息,请查看本文档中的部分。