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)
}