Быстрая ленивая инициализация не может соответствовать протоколу - PullRequest
0 голосов
/ 11 октября 2018

Я объявил несколько компонентов пользовательского интерфейса в протоколе.

protocol SomeViewContainer {
    var aView: ACustomizedView
    ...
}

class TestViewController: SomeViewContainer {
    var aView: ACustomizedView!

}

Приведенный выше код не пройдет, потому что компилятор не считает, TestViewController соответствует протоколу.

aView будет инициализирован после извлечения данных с пульта, поэтому я не могу просто удалить !.
Кроме того, я бы предпочел ленивую инициализацию, подобную следующей, для некоторых других свойств, объявленных в протоколе.

lazy var aView: UIView! = {

    }()

Все еще не удалось скомпилировать.Есть какие-нибудь идеи о том, как согласовать протокол с отложенной инициализацией?

1 Ответ

0 голосов
/ 11 октября 2018

Итак, две проблемы, одна из которых имеет свойство ACustomizedView!, не совпадает со свойством ACustomizedView, поэтому оно не соответствует

Во-вторых, вы должны иметь возможность использовать lazy.Это ваш реальный код?

Ленивая инициализация использует самоисполняющееся замыкание, поэтому он будет автоматически запускать код замыкания при вызове и предоставит свойству то, что замыкание ВОЗВРАЩАЕТСЯ

фактом, что у вас естьничто внутри замыкания не вызовет его разрушения.

Вам действительно нужно вернуть представление изнутри замыкания

lazy var aView: UIView = {
    let view = UIView()
    // configure view
    return view
}()
...