Есть ли обходной путь, чтобы указать внутренний список захвата функции и их модификатор в 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)")
    }
Другие вопросы по тегам