Есть ли обходной путь, чтобы указать внутренний список захвата функции и их модификатор в swift
Я искал в быстрой спецификации список захвата на внутреннем функционале, но без удачи, есть ли способ разорвать этот вид ссылочного цикла?
class Hello {
var name = "name"
var fn: (()->())? = nil
}
func foo() -> Hello? {
var bar: Hello? = Hello()
func wrapper() -> () -> () {
func inner() {
print("bar: \(bar)")
}
return inner
}
bar?.fn = wrapper()
return bar
}
var s = foo()
var b = Hello()
isKnownUniquelyReferenced(&s) // false
isKnownUniquelyReferenced(&b) // true
1 ответ
Решение
Чтобы использовать список захвата, вы должны использовать анонимную функцию (которую многие люди ошибочно называют "закрытием"). Итак, вы бы переписали свой
func inner() {
print("bar: \(bar)")
}
как
let inner : () -> () = { [weak bar] in
print("bar: \(bar)")
}