无法将'NSObject - >() - > PostFeed'类型的值转换为预期的参数类型'AnyObject?'

Alk*_*Alk 3 uiswitch ios swift

我正在UISwitch以下列方式添加:

  let anonSwitch : UISwitch = {
   let mySwitch = UISwitch()
    mySwitch.on = false
    mySwitch.setOn(false, animated: false);
    mySwitch.tintColor = UIColor(red: (69/255.0), green: (209/255.0), blue: (153/255.0), alpha: 1.0)
    mySwitch.addTarget(self, action: #selector(handleAnonSwitch), forControlEvents: .ValueChanged)

    return mySwitch
}()
Run Code Online (Sandbox Code Playgroud)

现在我在self关键字中收到以下错误消息mySwitch.addTarget:

 Cannot convert value of type 'NSObject -> () -> PostFeed' to expected argument type 'AnyObject?'
Run Code Online (Sandbox Code Playgroud)

self在所有其他addTarget函数中使用UIButton,我从未遇到过这个错误

Ben*_*ous 12

把你let变成一个lazy var.

我不确定编译器究竟在想什么(或者它的疯狂错误消息来自哪里),但我的猜测是这样的:

在Swift中,let必须在使用之前初始化的变量self.这样做的一个原因是编译器无法验证是否addTarget(action:forControlEvents:)会尝试调用anonSwitch()它获取的任何内容target,或者执行其他操作,例如访问将在之后初始化的其他变量anonSwitch,这取决于已完成的初始化这个对象.

使用lazy var意味着编译器可以验证anonSwitch之前不会访问的值self是否为有效对象,因为anonSwitch在初始化类的所有其他成员之前无法调用.