Есть ли обходной путь, чтобы указать внутренний список захвата функции и их модификатор в swift - PullRequest
0 голосов
/ 28 февраля 2019

Я искал в быстрой спецификации список захвата на внутреннем функционале, но без везения, есть ли способ разорвать этот тип справочного цикла?

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 Ответ

0 голосов
/ 28 февраля 2019

Чтобы использовать список захвата, вы должны использовать анонимную функцию (которую многие люди ошибочно называют «закрытием»).Таким образом, вы бы переписали ваш

    func inner() {
        print("bar: \(bar)")
    }

как

    let inner : () -> () = { [weak bar] in
        print("bar: \(bar)")
    }
...