快速的功能数组(需要解释输出)

时间:2019-01-25 08:31:36

标签: ios arrays swift

我当时正在使用swift,但从某个地方遇到了一个问题,但不了解运行该功能时会得到什么输出。

import UIKit

var i = 0
var closureArray : [() -> ()] = []

for _ in 1...5{
    closureArray.append {
        print(i)
    }
    i += 1
}

当我输入以下内容时,我会得到什么:-

closureArray[0]()

我知道答案,但我想知道其背后的解释。

3 个答案:

答案 0 :(得分:3)

您要将函数正文附加到closureArray上,没有返回类型,因为该函数类型没有输入参数,也没有返回类型。

所以只有closureArray将包含5个功能块。

每个元素本身就是一个只有一个print操作的函数,它将打印数组索引。但是,如果在for循环之后调用它们,它们将始终打印i

的最新值。

因此,closureArray[0]()将调用第0个索引函数,因为i的最新值为5,并且该函数将仅输出“ 5”并返回void。

解释非常简单。

答案 1 :(得分:0)

这将始终打印5,因为在遍历循环i=5后定义了全局变量。在循环之后,您正在调用闭包。不论closureArray的索引如何,它都将始终打印5.。

i的值仅在调用闭包后求值。

阅读“自动关闭”一章swift4指南:

https://docs.swift.org/swift-book/LanguageGuide/Closures.html

如果将闭包放入for循环中,则它将正常打印“ i”值 即0,1,2,3,4

for _ in 1...5{
    closureArray.append {
        print(i)
    }
    closureArray[0]()
    i += 1
}

答案 2 :(得分:0)

每次closureArray中附加的函数为print(i),并且每次迭代i的值都会增加。附加的函数返回void。因此,当您在每次迭代后看到closureArray[0]()的值时,它将打印i的每个值(即1到5)并返回 void 。如果在执行循环后看到closureArray[0]()的值,它将返回 5 void 。而且,对于数组索引,它将返回相同的值。