Swift中的lazy属性相当于Objective C中的lazy Init getter

时间:2014-06-03 19:46:04

标签: ios objective-c swift lazy-evaluation

Swift中的lazy属性是否相当于在Objective C中使用延迟加载模式覆盖getter?

3 个答案:

答案 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)

主要是 - 但它不能是计算属性