【问题标题】:Cannot convert value of type 'NSObject -> () -> PostFeed' to expected argument type 'AnyObject?'无法将类型“NSObject -> () -> PostFeed”的值转换为预期的参数类型“AnyObject?”
【发布时间】:2016-10-04 18:16:44
【问题描述】:

我通过以下方式添加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
}()

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

 Cannot convert value of type 'NSObject -> () -> PostFeed' to expected argument type 'AnyObject?'

我在 UIButton 的所有其他 addTarget 函数中使用 self,但我从未遇到此错误

【问题讨论】:

    标签: ios swift uiswitch


    【解决方案1】:

    将您的 let 更改为 lazy var

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

    在 Swift 中,必须先初始化 let 的变量,然后才能使用 self。造成这种情况的一个原因是编译器无法验证addTarget(action:forControlEvents:) 不会尝试调用anonSwitch()target 获取的任何内容,或者执行其他操作,例如访问将被初始化的不同变量在anonSwitch 之后,这取决于该对象的初始化是否完成。

    使用lazy var 意味着编译器可以验证分配给anonSwitch 的值在self 是一个有效对象之前不会被访问,因为直到所有其他对象都无法调用anonSwitch该类的成员已被初始化。

    【讨论】:

      猜你喜欢
      • 2017-01-06
      • 2015-12-24
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多