定义属性时无法在闭包中引用self

时间:2016-05-24 17:36:24

标签: swift swift2

我在网上看到了这个例子:

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?'

只是想澄清为什么我不能在这里引用自我以及我如何才能使这项工作成功。

2 个答案:

答案 0 :(得分:2)

您无法引用<!DOCTYPE html> <html> <body> <button class="button" onclick="disp()">Generate</button> <button class="button" onclick="show_ans()">Show</button> <script> function disp() { var i = Math.floor((Math.random() * 51) + 1); var j = 2 * i; document.getElementById("Goal").innerHTML = [i]; function show_ans() { document.getElementById("answer").innerHTML = [j]; } } </script> <p> Random Integer: <span id="Goal"></span> </p> <p> Computed Answer: <span id="answer"></span> </p> </body> </html> ,因为常量会在self初始化之前设置。

您可以通过将其声明为self而不是lazy var来解决问题。通过声明let,您告诉您希望lazy var在第一次使用时进行初始化:

var

作为旁注,使用Swift 2.2,您应该将选择器定义为lazy var newButton: UIButton = { let button = UIButton() button.addTarget(self, action: Selector("someAction"), forControlEvents: UIControlEvents.TouchUpInside) return button }()

答案 1 :(得分:0)

假设您在类范围内(不在方法内部等)写入此内容。基于一些实验,似乎self将是对类类型的引用,而不是实例。这可能是因为在Swift中,在初始化所有字段之前,您无法在初始化过程中引用self,并且super上发生了对初始化程序的任何必要调用。

如果您需要将属性作为常量,则必须在初始化程序中执行此操作,遵守初始化的顺序要求:

let newButton: UIButton

init() {
    newButton = UIButton()

    super.init()

    button.addTarget(self, action: Selector("someAction"), forControlEvents: UIControlEvents.TouchUpInside)
}