Lazy var дает "член экземпляра не может использоваться при ошибке типа"

У меня была эта ошибка несколько раз, и я прибегал к различным обходным решениям, но мне действительно интересно, почему это происходит. Основной сценарий следующий:

class SomeClass {
  var coreDataStuff = CoreDataStuff!
  lazy var somethingElse = SomethingElse(coreDataStuff: coreDataStuff)
}

Итак, я понимаю, что я не могу использовать self до того, как класс полностью инициализирован, но в этом случае я использую self property coreDataStuff для инициализации lazy var, который не произойдет, пока мой экземпляр не будет готов.

Кто-нибудь может объяснить мне, почему я Instance member can not be used on type ошибка?

Ответ 1

Попробуйте следующее:

class SomeClass {
  var coreDataStuff = CoreDataStuff!
  lazy var somethingElse: SomethingElse = SomethingElse(coreDataStuff: self.coreDataStuff)
}

Важно точно указать тип вашего ленивого var и добавить self. к аргументу, который вы передаете

Ответ 2

Есть два требования, которые легко упускать из виду с ленивыми переменными в Swift, и, к сожалению, предупреждения являются загадочными и не объясняют, как их исправить.

Предельные требования к переменной

  • Использовать self.: При обращении к членам экземпляра вы должны использовать self.. (Например, self.radius.)

    Если вы забудете использовать self., вы получите эту ошибку:

    Член экземпляра 'myVariable' не может использоваться для типа 'MyType'

  • Укажите тип: Тип не может быть выведен, он должен быть явно написан. (Например, : Float.)

    Если вы забудете указать тип, вы получите эту ошибку:

    Использование неразрешенного идентификатора 'self'

Пример

struct Circle {
  let radius: Float
  lazy var diameter: Float = self.radius * 2 // Good
//lazy var diameter        =      radius * 2 // Bad (Compile error)
}