我正在通过以下方式添加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
,我从未遇到此错误
答案 0 :(得分:12)
将您的let
更改为lazy var
。
我不确定编译器到底在想什么(或者它的疯狂错误信息来自哪里),但我猜是这样的:
在Swift中,必须先初始化let
变量才能使用self
。这样做的一个原因是编译器无法验证addTarget(action:forControlEvents:)
是否会尝试在anonSwitch()
获取的任何内容上调用target
,或者执行其他操作,就像访问将在anonSwitch
之后初始化的另一个变量一样,这取决于为此对象完成的初始化。
使用lazy var
意味着编译器可以验证分配给anonSwitch
的值在self
是有效对象之前不会被访问,因为它赢了可以调用anonSwitch
,直到该类的所有其他成员都已初始化。