Swift中的lazy属性是否相当于在Objective C中使用延迟加载模式覆盖getter?
答案 0 :(得分:6)
来自文档:
惰性存储属性是一个属性,其初始值在第一次使用之前不会计算。通过在声明之前写入lazy属性来指示延迟存储的属性。
所以,大多数情况下,是的。
必须始终将lazy属性声明为变量(使用var关键字),因为在实例初始化完成之后才可能检索其初始值。常量属性在初始化完成之前必须始终具有值,因此不能声明为惰性。“
请记住,在Swift上,您可以选择为您的属性声明自定义getter和setter:
var name : String?{
get{
return "Oscar"
}
set(newValue){
}
}
答案 1 :(得分:3)
参考:
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
。
答案 2 :(得分:2)
主要是 - 但它不能是计算属性