我当时正在使用swift,但从某个地方遇到了一个问题,但不了解运行该功能时会得到什么输出。
import UIKit
var i = 0
var closureArray : [() -> ()] = []
for _ in 1...5{
closureArray.append {
print(i)
}
i += 1
}
当我输入以下内容时,我会得到什么:-
closureArray[0]()
我知道答案,但我想知道其背后的解释。
答案 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 。而且,对于数组索引,它将返回相同的值。