为什么这段代码在 swift 中编译在此块中捕获自我?

Why this code capturing self inside this block compile in swift?

我在一个项目中遇到过多个这样的案例,

class ViewController: UIViewController {
   private let clearCacheButton: UIButton = {
       let button = UIButton(type: .custom)
       button.setTitle(AppMessages.General.Action.clearCache.description, for: .normal)
       button.addTarget(self, action: #selector(clearCache), for: .touchUpInside)
       return button
   }()
}

正在捕获 self 以添加按钮目标,但编译器不会抱怨在初始化之前捕获 self,即使没有 lazy var 修饰符它也能工作...

这是为什么? 这只是Apple在某个时候添加的一点便利吗?

如果我没记错的话,以前是不可能的

感谢您的回复

编译器从来没有抱怨过这个。但它应该(并且我已经在这一点上提交了一个错误),因为你编写的代码将不起作用:点击时按钮实际上不会做任何事情。 (该应用程序甚至可能会崩溃,但也可能不会。)

原因(对于这两种现象)是编译器误解了这里的术语self意味着class — 在实例初始化之前确实存在。

解决办法是用lazy var代替let。这确实有效,因为现在直到实例确实存在时才会真正调用代码。