Почему функция #selector не работает, если свойство не является отложенным var (а компилятор не сообщает мне об этом)? - PullRequest
0 голосов
/ 05 июня 2019

Я создаю свойство распознавателя жестов в классе и передаю функцию @objc в качестве аргумента.

private let tapGestureRecognizer =
    UITapGestureRecognizer(
        target: self,
        action: #selector(toggleTapped))

@objc private func toggleTapped() {
    //some actions
}

Но функция toggleTapped () не вызывается после запуска распознавателя жестов.Только если я изменю декларацию свойства на lazy var, кажется, все работает.

Почему компилятор не сообщает мне о моей ошибке?Это ошибка компилятора или я что-то упустил?Спасибо.

1 Ответ

0 голосов
/ 05 июня 2019

Поскольку переменным let присваивается значение до запуска self/super.init, это означает, что self еще не существует. Переменной lazy присваивается значение, когда это необходимо, и ПОСЛЕ init, что означает, что self существует. Ваш жест ссылается на self, и поэтому его создание необходимо отложить до фактического существования self.

...