Initializing property via closure

前端 未结 2 1394
醉酒成梦
醉酒成梦 2021-01-15 01:48

I\'ve observed that people sometimes using closures to initialize properties. e.g. instead of

lazy var test1: String = String(\"a string\")
<
相关标签:
2条回答
  • 2021-01-15 02:24

    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.

    0 讨论(0)
  • 2021-01-15 02:29

    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)
    }()
    
    0 讨论(0)
提交回复
热议问题