【发布时间】:2014-09-03 05:50:54
【问题描述】:
更新:我试着写它而不让它变弱,而且似乎没有泄漏。所以也许这个问题不再需要了。
在 Objective-C ARC 中,当你想让一个闭包能够在闭包内部使用它自己时,块不能捕获对自身的强引用,否则它将是一个保留循环,所以你可以改为闭包捕获对自身的弱引用,如下所示:
// This is a simplified example, but there are real uses of recursive closures
int (^fib)(int);
__block __weak int (^weak_fib)(int);
weak_fib = fib = ^(int n) {
if (n < 2)
return n;
else
return weak_fib(n-1) + weak_fib(n-2);
};
我试图把它翻译成 Swift:
var fib: (Int -> Int)?
fib = { [weak fib] (n: Int) in // 'weak' cannot be applied to non-class type 'Int -> Int'
if n < 2 {
return n
} else {
return fib!(n-1) + fib!(n-2)
}
}
但是,Swift 编译器不允许我声明要弱捕获的函数 ('weak' cannot be applied to non-class type 'Int -> Int')。 [unowned fib] 也不起作用 ('unowned' cannot be applied to non-class type '(Int -> Int)?')。
我知道函数不是 Swift 中的类类型。但是,它们是引用类型,并且它们确实参与了引用计数。因此,不应该有办法让它们成为弱引用或无主引用吗?
如何在没有保留循环的 Swift 中编写递归闭包?
【问题讨论】:
-
我认为它们的意思是闭包具有引用语义(它们不只是复制自己和它们在赋值中的所有状态),而不是它们是引用计数类型。对于语言来说,递归似乎是一个足够基本的想法,他们不会犯那么大的错误......对吗?
标签: swift closures objective-c-blocks weak-references retain-cycle