Swift 定义属性时无法在闭包中引用self
我在网上某处看到了这个例子:Swift 定义属性时无法在闭包中引用self,swift,swift2,Swift,Swift2,我在网上某处看到了这个例子: let newButton:UIButton = { let button = UIButton() return button }() 当我加上: button.addTarget(self, action: Selector("someAction"), forControlEvents: UIControlEvents.TouchUpInside) 我收到错误消息: Cannot convert value of type 'NSObjec
let newButton:UIButton = {
let button = UIButton()
return button
}()
当我加上:
button.addTarget(self, action: Selector("someAction"), forControlEvents: UIControlEvents.TouchUpInside)
我收到错误消息:
Cannot convert value of type 'NSObject -> () -> ViewController' to expected argument type 'AnyObject?'
我只是想澄清一下为什么我不能在这里引用self,以及我如何可能做到这一点。你不能引用
self
,因为常量是在self
初始化之前设置的
您可以通过将其声明为lazy var
而不是let
来解决此问题。通过声明它lazy var
,说明您希望在第一次使用var
时对其进行初始化:
lazy var newButton: UIButton = {
let button = UIButton()
button.addTarget(self, action: Selector("someAction"), forControlEvents: UIControlEvents.TouchUpInside)
return button
}()
作为补充说明,使用Swift 2.2,您应该将选择器定义为
#选择器(YourClass.someAction)
假设您是在类范围内编写的(而不是在方法内,等等)。根据一些实验,似乎self
将是对类类型的引用,而不是实例。这可能是因为在Swift
中,在初始化所有字段以及在super
上对初始值设定项进行任何必要的调用之前,您不能在初始化过程中引用self
如果需要属性为常量,则必须在初始值设定项中执行此操作,并遵守初始化的顺序要求:
let newButton: UIButton
init() {
newButton = UIButton()
super.init()
button.addTarget(self, action: Selector("someAction"), forControlEvents: UIControlEvents.TouchUpInside)
}