MBulli MBulli - 24 days ago 7
Swift Question

Lazy readonly property in swift

While playing a little bit with Swift I tried to write a readonly and lazy initialized property. I quickly wrote that line of code just to learn that it's not allowed.

// no valid Swift code.
lazy let foo : Int = { return 42 }()


You have to declare lazy properties as
var
.
The swift book clearly states that let with lazy is not possible for a good reason:


“You must always declare a lazy property as a variable (with the var keyword), because its initial value might 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.”


Supposing I would like to have a readonly lazy property in swift. Whats the best way to archive that?

Answer

If readonly and private are synonyms for you in this specific case, then you can make the setter private by explicitly declaring it:

private(set) lazy var foo : Int = { return 42 }()

That's a good compromise between immutability and laziness.