当引用循环不太可能发生时,@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 的情况下明确使用。
您仍然需要手动指定 weak
和 unowned
捕获 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
}
使用 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 的情况下明确使用。
您仍然需要手动指定 weak
和 unowned
捕获 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
}