当引用循环不太可能发生时,@escaping 闭包中的隐式 self Swift 5.3

Implicit self in @escaping Closures when Reference Cycles are Unlikely to Occur Swift 5.3

使用 SE-0269 我们将不再需要在下面的引用类型中使用显式。

class Test {
    var x = 0
    func execute(_ work: @escaping () -> Void) {
        work()
    }
    func method() {
        execute { [self] in
            x += 1
        }
    }
}

这会处理 [weak self] 和 [unowned self] 还是我们应该在这个提案的 weak 和 unowned 的情况下明确使用。

您仍然需要手动指定 weakunowned 捕获 self。 SE-0269 导致的唯一变化是,当您确认使用 [self] 强烈捕获 self 时,您无需在访问实例 properties/methods 时显式写出 self. .

[weak self]的情况下,你仍然需要在闭包中显式地写self.,但是当使用[unowned self]时,你可以像使用[一样省略self. =16=].

execute { [weak self] in
    x += 1 // Error: Reference to property 'x' in closure requires explicit use of 'self' to make capture semantics explicit
}

execute { [weak self] in
    self?.x += 1 // need to manually specify `self?.`
}

execute { [unowned self] in
    x += 1 // compiles fine
}