更新:弱くせずに書いてみましたが、漏れはないようです。そのため、その質問は不要になったのかもしれません。
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 で保持サイクルを持たない再帰的クロージャーをどのように記述しますか?