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

sal*_*qui 2 ios swift swift5

使用SE-0269,我们将\xe2\x80\x99 在下面的情况下不再需要使用显式引用类型。

\n
class Test {\n    var x = 0\n    func execute(_ work: @escaping () -> Void) {\n        work()\n    }\n    func method() {\n        execute { [self] in\n            x += 1\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是否会处理[weak self]和[unowned self],或者我们应该在该提案中明确使用weak和unowned的情况。

\n

Dáv*_*tor 6

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

如果[weak self]你仍然需要显式地写self.在闭包中,但是在使用 时[unowned self],你可以self.像使用 时一样省略[self]

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
}
Run Code Online (Sandbox Code Playgroud)