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

时间:2016-06-04 21:57:42

标签: ios swift uiswitch

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

现在,我在self的{​​{1}}关键字上收到以下错误消息:

mySwitch.addTarget

我在 Cannot convert value of type 'NSObject -> () -> PostFeed' to expected argument type 'AnyObject?' 的所有其他self函数中使用addTarget,我从未遇到此错误

1 个答案:

答案 0 :(得分:12)

将您的let更改为lazy var

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

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

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