<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">AFAIU with the current proposal I would have to write the following to give a let property a default value:</div><div class=""><br class=""></div>class C {<div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>var x: Int</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>var y: Int</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let c: Int</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>memberwise init(…, c: Int = 42) {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                </span>self.c = c</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div class="">}</div><div class=""><br class=""></div><div class="">Did I understand this right?</div><div class=""><br class=""></div><div class="">-Thorsten</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">Am 08.01.2016 um 04:37 schrieb Matthew Johnson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt;:</div><br class="Apple-interchange-newline"><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" class=""><div class=""><br class="Apple-interchange-newline">On Jan 7, 2016, at 8:55 PM, Joe Groff via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">The proposal says that "let" properties with inline initializers should be left out of the memberwise initialization, AIUI on the grounds that a manually-written initializer would not be allowed to override the inline initialization:</div></div></blockquote><div class=""><br class=""></div><div class="">Yes, this is because Chris insisted that the proposal be pure sugar for something that could be manually written. &nbsp;This ensures that anyone using memberwise initialization can stop using it in any case where that becomes necessary.&nbsp;</div><br class=""><blockquote type="cite" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><br class=""></div><blockquote class="" style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><div class="">class C {</div><div class="">&nbsp; let x = 1738</div><div class="">&nbsp; init(x: Int = 679) {</div><div class="">&nbsp; &nbsp; self.x = x // Error, self.x already initialized</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div></blockquote>However, this is also true for vars. Semantically, if you change 'x' to a var in the above example, you get an initialization followed by an assignment:<div class=""><br class=""></div><blockquote class="" style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><div class=""><div class="">class C {</div></div><div class=""><div class="">&nbsp; let x = dump(1738)</div></div><div class=""><div class="">&nbsp; init(x: Int = dump(679)) {</div></div><div class=""><div class="">&nbsp; &nbsp; self.x = x</div></div><div class=""><div class="">&nbsp; }</div></div><div class=""><div class="">}</div></div></blockquote><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>&nbsp; &nbsp; C() // dumps 1738, then 679</div><div class=""><br class=""></div><div class="">which, if the initialization has side effects, will likely be surprising. We could say that the memberwise initializer elides the inline initialization of `var`s, on the grounds that initializations ought not to have side effects, but then we're introducing a behavior change in inline initializers for `var`s in the face of `memberwise` initializers that also cannot be replicated by a manually-written initializer. If we make that behavior change for vars, I think it's reasonable, and more orthogonal, to extend the same grace to lets as well. That also simplifies the rules for what appears in the memberwise initializer—there's now only two rules (or one, if we also remove the access control filter, as I've suggested in another subthread).</div></div></blockquote><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">I agree. &nbsp;The dual assignment for `var` seems wasteful in addition to potentially surprising and the limitation for `let` is unfortunate. &nbsp;Of course the same can be said for all initializers that might wish to assign a different value to a `let` or do assign a different value to a `var`.</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="">What you suggest is exactly how I wanted the proposal to work. &nbsp;Chris was opposed to this approach. &nbsp;I would be very happy with this change if you can sell Chris on it! &nbsp;I think many others would be as well.&nbsp;</div><div class=""><br class=""></div><div class="">In addition to this not being possible to implement manually, Chris explained to me that it is important to the optimizer to be able to assume a `let` with an inline initializer will never have any other value (especially when that inline initializer is a constant value). &nbsp;Allowing an instance member to be optimized away when initialized with a constant value enables it to be referenced with convenient syntax due to implicit `self`. &nbsp;It would have never occurred to me to make a true constant value an instance property, but apparently this is a common practice. &nbsp;And with a guaranteed optimization is makes sense to take advantage of the implicit `self`. &nbsp;</div><div class=""><br class=""></div><div class="">At the same time, IMO the inability to provide a default value for a property that is only used when it is not initialized manually is a more important issue. &nbsp;I wish the “inline initializer” worked this way. &nbsp;</div><div class=""><br class=""></div><div class="">I know the implementation would be a bit more complex - the compiler would have to analyze the body of non-memberwise initializers before synthesizing the inline-initialization if necessary. &nbsp;But it already emits an “uninitialized member” error message so it already knows which properties are initialized and which are not. &nbsp;That information may not be available in the right part of the compiler but we do not how to determine this.</div><div class=""><br class=""></div><div class="">This would solve the init / assign problem for `var` and the no overridable default problem for `let` in both existing and memberwise initializers. &nbsp;It would also mean that memberwise initializers can work this way while still being pure sugar for code that can be written manually. &nbsp;Unfortunately this seems like something that is not open for change.</div><div class=""><br class=""></div><div class="">Matthew</div></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=1MXK54sosN3xru3iYcLt0oBZ2w20i49gyogXctgrspfABpjGzhsk3-2FwC5GiNAJ8W-2Bjd2AQbSAZ2c2Z2ynliPHvOOl0MWAgkuPvuTvS450pvN5ZZZaIyKuWNvd9Ze9Gr4RybtzWEgLh-2BO77eOJLYOyEHHlnsSJYTPfwB-2BcGzHr-2BJcKET0np9ojwCsbRJQA9WiIC0777aLUZcg-2FC7MkZLTfR-2FW6d3xH6jJFdm9vOtk7jI-3D" alt="" width="1" height="1" border="0" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""><span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:swift-evolution@swift.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></div></body></html>