Является ли ленивый атрибут в Swift эквивалентным переопределению геттера с ленивым шаблоном загрузки в Objective C?
Ленивый атрибут в Swift эквивалентен ленивому Init getter в Objective C
Ответ 1
Из документов:
Ложное хранимое свойство - это свойство, начальное значение которого не рассчитывается до первого использования. Вы указываете ленивое сохраненное свойство, записывая ленивый атрибут перед его объявлением.
Итак, в основном, да.
Вы всегда должны объявлять ленивое свойство как переменную (с ключевым словом var), поскольку ее начальное значение не может быть получено до завершения инициализации экземпляра. Константные свойства всегда должны иметь значение перед завершением инициализации и, следовательно, не могут быть объявлены ленивыми.
Помните, что в Swift у вас есть возможность объявить пользовательские геттеры и сеттеры для ваших свойств:
var name : String?{
get{
return "Oscar"
}
set(newValue){
}
}
Ответ 2
Ссылаясь на это:
lazy var x = SomeFunction()
Ближайший эквивалент в Objective-C будет примерно таким:
@property BOOL xHasBeenSet;
@property id x;
- (id)x
{
if (!self.xHasBeenSet) {
self.x = SomeFunction();
}
return x;
}
- (void)setX:(id)x
{
_x = x;
self.xHasBeenSet = YES;
}
Здесь вы можете видеть только SomeFunction
при первом просмотре x
, но только если вы не установите x
в первую очередь. Важно отметить, что существует только один путь кода, куда вызывается правая сторона, и она никогда не возвращается к xHasBeenSet = NO
.
Ответ 3
в основном да - это не может быть вычисленное свойство, хотя