<html><body><div id="edo-message"><div>Maybe there are several initialisers, with different ways of calculating 'y' depending on what you give it.</div><div><br></div><div>Karl<br></div></div><div id="edo-original"><div><br><br><blockquote type="cite" style="margin:1ex 0 0 0;border-left:1px #ccc solid;padding-left:0.5ex;"><div>On Jun 15, 2016 at 2:26 PM, &lt;<a href="mailto:charlie@charliemonroe.net">Charlie Monroe</a>&gt; wrote:<br><br></div><div><pre>Is there a particular reason for not using lazy var here?
<br>
<br>class MySuperClass {
<br>        init() {}
<br>}
<br>
<br>class MyClass : MySuperClass {
<br>
<br>        let x: Int
<br>        lazy var y: String = self.someInstanceMethod()
<br>
<br>        init(x: Int) {
<br>                self.x = x
<br>                super.init()
<br>        }
<br>
<br>        func someInstanceMethod() -&gt; String {
<br>                return "Kaboom"
<br>        }
<br>}
<br>
<br>
<br>
<br>&gt; On Jun 15, 2016, at 2:22 PM, Karl via swift-evolution &lt;<a dir="ltr" href="mailto:swift-evolution@swift.org" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="2">swift-evolution@swift.org</a>&gt; wrote:
<br>&gt;  
<br>&gt; Say you have the following code. There is a property on MyClass (‘y’) which is derived from other data via an instance method; Two-stage initialisation.
<br>&gt;  
<br>&gt; class MySuperClass {
<br>&gt;         init() {}
<br>&gt; }
<br>&gt;  
<br>&gt; class MyClass : MySuperClass {
<br>&gt;  
<br>&gt;         let x : Int
<br>&gt;         var y : String
<br>&gt;  
<br>&gt;         init(x: Int) {
<br>&gt;  
<br>&gt;                 self.x = x
<br>&gt;                 super.init()
<br>&gt;                 y = someInstanceMethod()
<br>&gt;         }
<br>&gt; }
<br>&gt;  
<br>&gt; The code won’t compile because you call super.init before initialising all properties. The way to work-around this so far is to make the type of ‘y’ an implicitly-unwrapped optional. I don’t think it’s very elegant to have to change the type of ‘y’ in this case - it exposes implementation details and implies that the value may sometimes be nil, which is not the case.
<br>&gt;  
<br>&gt; What about if we allowed you to explicitly declare that it’s okay for ‘y’ not to be initialised before calling super.init? Perhaps by assigning it to the underscore:
<br>&gt;  
<br>&gt; self.x = x
<br>&gt; y = _
<br>&gt; super.init()
<br>&gt; y = someInstanceMethod()
<br>&gt;  
<br>&gt; 'y' would still effectively work as an implicitly-unwrapped optional - the value would be initialised to nil, and any attempt to use it before it is initialised would be a fatal runtime error as with an IUO. This also means that it couldn’t be a “let” value.
<br>&gt;  
<br>&gt; This change wouldn’t give you any additional safety when using two-stage initialisation; it would simply not require you to change the type of the property when doing so.
<br>&gt;  
<br>&gt; Thoughts?
<br>&gt;  
<br>&gt; Karl
<br>&gt; _______________________________________________
<br>&gt; swift-evolution mailing list
<br>&gt; <a dir="ltr" href="mailto:swift-evolution@swift.org" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="3">swift-evolution@swift.org</a>
<br>&gt; <a dir="ltr" href="https://lists.swift.org/mailman/listinfo/swift-evolution" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="4">https://lists.swift.org/mailman/listinfo/swift-evolution</a>
<br>
<br></pre></div></blockquote></div></div></body></html>