我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关键字上收到以下错误消息mySwitch.addTarget:
self
mySwitch.addTarget
Cannot convert value of type 'NSObject -> () -> PostFeed' to expected argument type 'AnyObject?'
我self在所有其他addTarget功能中都使用了该功能UIButton,但从未遇到此错误
addTarget
UIButton
更改let为lazy var。
let
lazy var
我不确定编译器到底在想什么(或者它的疯狂错误消息来自何处),但是我的猜测是:
在Swift中,let必须先初始化变量,然后才能使用self。造成这种情况的一个原因是,编译器无法验证addTarget(action:forControlEvents:)不会尝试调用anonSwitch()其获得的所有内容target,或执行其他操作,例如访问将在之后初始化的其他变量anonSwitch,这取决于初始化是否已完成这个对象。
addTarget(action:forControlEvents:)
anonSwitch()
target
anonSwitch
使用lazy var意味着编译器可以验证anonSwitch之前不会访问分配给它的值self是一个有效的对象,因为anonSwitch在初始化该类的所有其他成员之前,无法调用。