Reputation: 29529
I've observed that people sometimes using closures to initialize properties. e.g. instead of
lazy var test1: String = String("a string")
they use
lazy var test2: String = { String("a string") }()
What is the benefit/convenience in using closure to initialize property?
Upvotes: 2
Views: 157
Reputation: 31685
In general, if there is no extra work needed for the lazy variable after the initialization for it, it would be enough do declare it without the closure initialization.
For instance, for a simple string it is fair to implement:
lazy var myString = "a string"
However, when it comes to something needs more editing (setup) -like CLLocationManager
for instance-, you would naturally go with the closure initialization:
lazy var locationManager: CLLocationManager = {
var lm = CLLocationManager()
// here is one extra thing to do:
lm.delegate = self
return lm
}()
As mentioned, at some point we needed to do additional step(s) after the initialization (which is lm.delegate = self
in the above example).
Referring to your case, since there is nothing should happen after the initialization, both:
lazy var test1: String = String("a string")
and
lazy var test2: String = { String("a string") }()
are the same. You should go with the first one as a shorthand typing.
Upvotes: 1
Reputation: 6018
These two do the same work. Closure initialization comes handy when you need extra code to configure property object. E.g.:
lazy var point: CGPoint = {
let x = ...
let y = ...
return CGPoint(x: x, y: y)
}()
Upvotes: 1