Pablo
Pablo

Reputation: 29529

Initializing property via closure

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

Answers (2)

Ahmad F
Ahmad F

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

pacification
pacification

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

Related Questions