Как использовать self в ленивой инициализации в Swift - PullRequest
0 голосов
/ 23 сентября 2018

Некоторые веб-сайты рекомендуют инициализировать представления с помощью отложенной инициализации вместо раскадровки.

Работает, когда self не используется при отложенной инициализации.Но когда в нем используется self, возникает ошибка компиляции.

Например, в следующем коде label1 может быть успешно скомпилировано, но label2 не может, потому что selfиспользуется в нем.

Как использовать self в ленивой инициализации?

class A {
    private let label1: UILabel = {
        return UILabel()
    }()

    private let label2: UILabel = {
        let view = UILabel()
        self.addTextToLabel(view) // compile error !!!
        return view
    }()

    private func addTextToLabel(label: UILabel) {
        label.text = "test"
    }
}

1 Ответ

0 голосов
/ 23 сентября 2018

Ваш вопрос написан из-за неправильного понимания того, что вы в настоящее время используете ленивую инициализацию.Но вы не.И label1, и label2 не используют отложенную инициализацию.Они инициализируются немедленно при инициализации A, и это является причиной ошибки, поскольку self не готов при вызове этих инициализаторов свойств.

Решение состоит в том, чтобы фактически сделать label2ленивое свойство.

private lazy var label2: UILabel = {
    let view = UILabel()
    self.addTextToLabel(label: view)
    return view
}()

Но учтите, что эта инициализация label2 не произойдет, пока вы в первый раз не попытаетесь получить доступ к свойству label2.

Согласно документам:

Ленивое хранимое свойство - это свойство, начальное значение которого не рассчитывается до первого использования.Вы указываете ленивое сохраненное свойство, записывая модификатор lazy перед его объявлением.

Ленивые свойства полезны, когда начальное значение свойства зависит от внешних факторов, значения которых неизвестны до тех пор, пока не завершится инициализация экземпляра.

Ссылка: https://docs.swift.org/swift-book/LanguageGuide/Properties.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...