Обновление: Я пробовал писать его, не делая его слабым, и, похоже, утечки нет. Поэтому, возможно, вопрос больше не нужен.
В 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, которое не имеет цикла сохранения?