Swift:关闭-已捕获列表

尊敬的开发商,

欢迎使用,今天我们将研究什么是闭包捕获列表以及如何快速使用它。

例子1

如果您曾经看过上面的代码,并且想知道[]之间的hack是什么,或者您无法理解,则可能是数组之类的东西。 这只是关闭捕获的列表。 不要强调[弱者],一旦完成本教程,您将能够解决这个谜团

让我们从一个简单的例子开始

例子2

闭包打印不同的值,因为闭包引用了变量“ a”和“ b”。 是闭包是引用类型,当值更改时闭包将反映出来。 有时,如果您的变量发生更改并且闭包引用了该变量,那将是非常灾难。

让我们通过示例来了解这个问题。

例子3

在上面的示例中,我们创建了一个闭包数组。 闭包不带任何参数,也不返回任何东西。 接下来,我们向闭包数组{print(i)}添加一个值

我们何时迭代并像这样调用闭包。

您能猜出输出是什么吗?……,嗯,如果您认为输出将是1 2 3 4 5,那么这里就不是这样了。 输出将是

所以这里出了什么问题,孔闭合是在执行for循环后引用i的最终值, 5

解决方案:让我们回到我们的第一个Example 2类型。

上面的闭包与示例2相同,但是差异[c,d]很小,您可能将其与数组混淆。 让我解释一下,当您在[ in ]之前的[]中输入变量时,闭包不再引用原始值,而是创建自己的变量副本,这称为C aptured list。

因此,即使您更改了原始值,闭包也不会反映该更改。

因此, 示例3的解决方案是

现在每个闭包捕获每个循环中j的当前值,因此当我们迭代数组时,输出将为0 1 2 3 4。

有时我们可能想为捕获的变量使用不同的名称,我们也可以像上面的示例一样更改。

在上面的示例中,我们采用了一个新的变量“ capturedJ”,好像我们不想知道原始值来自何处。

消息:我没有在本教程中介绍什么是“弱自我”,因为我将以“带有闭包的内存管理”的形式对此进行介绍。