【发布时间】:2020-12-08 02:29:56
【问题描述】:
这里有很多关于尝试在 Swift 中定义递归闭包的有趣问题。我认为答案最清楚的是这篇询问why one can't declare and define a recursive closure in the same line in Swift 问题的帖子。但是,他们不会问相反的问题。也就是说,如果我不能创建这样的代码:
var countdown = { i in
print(i)
if i > 1 {
countdown(i - 1)
}
}
// error: Variable used within its own initial value
那为什么我可以写这样的代码:
func countdown(_ i: Int) {
print(i)
if i > 1 {
countdown(i - 1)
}
}
函数有什么特别之处,使得它们在自己的声明中不在尝试调用自己时遇到任何问题?我理解闭包背后的问题:它试图捕获一个尚不存在的值(闭包本身)。但是,我不明白为什么该功能没有同样的问题。查看Swift Book,我们看到:
全局函数是具有名称且不捕获任何值的闭包。
这是一个半答案:上面的函数不会引起问题,因为函数不捕获值。但是,如果函数不捕获值(尤其是递归值),它们如何工作?
【问题讨论】:
-
为什么函数需要捕获值才能工作?
-
因为您已将一个声明为属性,另一个声明为函数。
标签: swift function recursion closures