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)
}