Невозможно преобразовать значение типа "NSObject -> () -> PostFeed" в ожидаемый тип аргумента "AnyObject?"

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

1 ответ

Решение

Измени свой let в lazy var,

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

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

С помощью lazy var означает, что компилятор может проверить, что значение, присвоенное anonSwitch не будет доступен раньше self является допустимым объектом, потому что не удастся вызвать anonSwitch пока все остальные члены класса не будут инициализированы.

Другие вопросы по тегам