2016-06-04 2 views
3

Я добавляю UISwitch следующим образом:Невозможно преобразовать значение типа «NSObject ->() -> PostFeed» в ожидаемый тип аргумента «AnyObject?»

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 и я никогда не сталкиваюсь с этой ошибкой

ответ

12

Измените let на lazy var.

Я не уверен, что именно думает компилятор (или где его сумасшедший сообщение об ошибке исходит от), но я думаю, это:

В Swift, переменные, которые let должны быть инициализированы перед вами может использовать self. Одна из причин этого заключается в том, что компилятор не может проверить, что addTarget(action:forControlEvents:) не собирается пытаться позвонить anonSwitch() на все, что он получает за target, или сделать что-то еще, например получить доступ к другой переменной, которая будет инициализирована после anonSwitch, что зависит от инициализация завершена для этого объекта.

Использование lazy var означает, что компилятор может проверить, что значение, присвоенное anonSwitch не будет доступен до того self является объект, так как он не будет можно назвать anonSwitch до тех пор, пока не будут инициализированы все остальные члены класса ,

Смежные вопросы

 Смежные вопросы