首页 > 解决方案 > 快速关闭如何捕获 Int?

问题描述

想知道快速关闭捕获是如何工作的吗?就像i价值被捕获一样,思想j价值也会被捕获,但事实并非如此。有人可以解释一下这是如何被迅速关闭的吗ij

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

标签: swiftclosures

解决方案


有问题的闭包正在捕获对变量的引用,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

推荐阅读