Swift lazy initializer with lookup ability if value equals nil
Why do we need it? When to use?
If we are building an optional property which is massive resource consuming, the value is offed nil when some conditions are met.
We want the value been stored once it's off nil.
The property mentioned above is helpful in these scenarios:
- File directory lookup
- DB entity lookup
Is it just Swift lazy
property identifier?
No, lazy
property identifier of Swift is a one-time only initialization. Once it's nil, it always nil.
Implementation
The implementation is surprisingly tedious since Swift property cannot access backing instance (like _property
), we need an extra property for backing storage.
We then extract the getter part as a function out of the property.
Here's the sample code:
var lazyAndHeavyProperty: URL? {
// if lazyAndHeavyPropertyStorage is nil, will look up for updating value
get {
if lazyAndHeavyPropertyStorage == nil {
lazyAndHeavyPropertyStorage = lazyAndHeavyPropertyLookUp()
}
return lazyAndHeavyPropertyStorage
}
}
fileprivate var lazyAndHeavyPropertyStorage: URL?
fileprivate func lazyAndHeavyPropertyLookUp() -> URL? {
if conditionMet {
...
return URL
}
return nil
}