На самом деле все зависит от времени.Вы объявляете свойство экземпляра вместе с функцией define-and-call, которая инициализирует это свойство, и вы продолжаете говорить button.addTarget(self...
в этой функции.Тогда возникает вопрос: когда будет выполняться код этой функции?Невероятно, но это очень важно, настолько, что фактически меняет значение self
.
Когда вы говорите let
, чтобы сделать это объявление, код запускается в тот момент, когда экземпляр еще несуществовать.Пример именно то, что мы находимся в процессе формирования в тот момент;это еще не "приготовлено".Фактически, без вашего ведома, self
в этот момент означает класс UIButton! Следовательно, полученное целевое действие недопустимо;у вас нет метода класса postComment
;это метод экземпляра (правильно).И так позже, когда вы нажимаете кнопку, и мы пытаемся сказать postComment
классу, мы терпим крах.«Нераспознанный селектор отправлен в класс», в точности как вы говорите.
С другой стороны, когда вы говорите lazy var
, код не вызывается до тех пор, пока экземпляр self
не существует, self
означаетпример, и все хорошо.
Это ужасно смущает начинающих и не очень начинающих;даже указав на проблему, я сам совершил точно такую же ошибку.По моему мнению, компилятор должен поймать это и остановить вас, но это не так.Я подал ошибку: http://bugs.swift.org/browse/SR-4865