为什么这段代码在 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
。这确实有效,因为现在直到实例确实存在时才会真正调用代码。
我在一个项目中遇到过多个这样的案例,
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
。这确实有效,因为现在直到实例确实存在时才会真正调用代码。