1

我在 swift 规范中搜索了内部 func 上的捕获列表,但没有运气,有没有办法打破这种参考循环?

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
4

1 回答 1

2

要使用捕获列表,您必须使用匿名函数(许多人错误地称之为“闭包”)。所以,你会重写你的

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

作为

    let inner : () -> () = { [weak bar] in
        print("bar: \(bar)")
    }
于 2019-02-28T14:12:22.677 回答