在 4.2 以前,self
是全局保留关键字,因此若是在逃逸闭包中若是在闭包中把 self 标记为 weak 后,若是要使用须要使用 ` 包起来:git
guard let `self` = self else { return }
复制代码
虽然这样解决了变量名的问题,可是也带来另一个困扰,控制台里不会显示一个名为 self 的变量。因此也有一种广泛的作法是取个别名,好比 strongSelf:github
doSomething(then: { [weak self] in
guard let strongSelf = self { else return }
strongSelf.doSomethingElse()
)
复制代码
虽然这种写法达到了目的,可是若是一个刚上手的开发者看到这样的写法确定会一头雾水。swift
我等屁民能作的固然就是给苹果爸爸不断的提意见啦。皇天不负有心人,在 4.2 中苹果终于响应了这个要求!如今 otional binding 中 self 再也不做为保留关键字。 如今能够光明正大这么写了:闭包
guard let self = self else { return }
复制代码
固然取消了这个限制后也意味着 self 可能不必定是 self 了:app
var number: Int? = nil
if let self = number {
print(self) // 这里的 self 是 number:Int
}
复制代码
但愿你们使用 self 做为 optional binding 变量名的时候仍是用在正确的地方,省得形成其余的困扰。ui
SE0079:Allow using optional binding to upgrade self from a weak to strong referencespa