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

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

Upvotes: 5

Views: 3486

Answers (3)

Brian Nickel
Brian Nickel

Reputation: 27560

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.

Upvotes: 3

Oscar Swanros
Oscar Swanros

Reputation: 19969

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

  }
}

Upvotes: 6

Daij-Djan
Daij-Djan

Reputation: 50109

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

Upvotes: 2

Related Questions