lazy attribute in Swift equivalent to lazy Init getter in Objective C

只谈情不闲聊 提交于 2019-12-06 02:54:51

问题


Is the lazy attribute in Swift equivalent to overriding the getter with a lazy loading pattern in Objective C?


回答1:


From the docs:

A lazy stored property is a property whose initial value is not calculated until the first time it is used. You indicate a lazy stored property by writing the lazy attribute before its declaration.

So, mostly, yes.

You must always declare a lazy property as a variable (with the var keyword), because its initial value may not be retrieved until after instance initialization completes. Constant properties must always have a value before initialization completes, and therefore cannot be declared as lazy.”

Remember that on Swift you have the option to declare custom getters and setters for your properties:

var name : String?{
  get{
    return "Oscar"
  }
  set(newValue){

  }
}



回答2:


Referring to this:

lazy var x = SomeFunction()

The closest equivalent in Objective-C would be something like:

@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;
}

Here you would only see SomeFunction called the first time you read x, but only if you don't set x first. It's important to note that there is only one code path where the right side gets called and it never resets back to xHasBeenSet = NO.




回答3:


mainly yes-- it can't be a computed property though



来源:https://stackoverflow.com/questions/24023664/lazy-attribute-in-swift-equivalent-to-lazy-init-getter-in-objective-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!