一尘不染

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

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
}()

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

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

self在所有其他addTarget功能中都使用了该功能UIButton,但从未遇到此错误


阅读 262

收藏
2020-07-07

共1个答案

一尘不染

更改letlazy var

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

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

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

2020-07-07