<div dir="ltr"><div>Strongly +1 on proposals #1 and #2. Cautiously +1 on #3 (I’m not sure about side effects there).</div><div><br></div><div>If #1 is already possible as Jon Shier says using an extension, I’d say it deserves promotion to be part of the language (e.g. Mike’s proposed `default init`), or at least should be made more discoverable (e.g. using a Fix-It on an implementation equivalent to the default initializer).</div><div><br></div><div><br></div><div>–Bastiaan</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 21, 2017 at 8:00 PM, Jon Shier via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div>1 can already be accomplished by moving the custom initializer into an extension. </div><div><br></div><div><br></div><div>Jon</div><div><br><blockquote type="cite"><div><div class="h5"><div>On Jun 21, 2017, at 7:42 PM, Mike Kluev via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_2315186809508713651Apple-interchange-newline"></div></div><div><div><div class="h5"><div dir="ltr"><div>hi. here are a few somewhat related initializer proposals for your consideration.</div><div>they are designed as &quot;opt-ins&quot; so shall not break existing code.</div><div><br></div><div>***** proposal 1 *****</div><div>have an ability to keep default initializers in structs</div><div><br></div><div>struct S {</div><div>    var int: Int</div><div>    var float: Float</div><div>    var bool: Bool</div><div>}</div><div><br></div><div>here default initializer is currently generated:</div><div><br></div><div>struct S {</div><div>    var int: Int</div><div>    var float: Float</div><div>    var bool: Bool</div><div>    </div><div>//  autogenerated:</div><div>//  init(int: Int, float: Float, bool: Bool) {</div><div>//      <a href="http://self.int/" target="_blank">self.int</a> = int</div><div>//      self.float = float</div><div>//      self.bool = bool</div><div>//  }</div><div>}</div><div><br></div><div>so we can write:</div><div><br></div><div>let s = S(int: 0, float: 0, bool: false)</div><div><br></div><div>so far so good. now i want to add a &quot;convenience&quot; initializer. i don&#39;t want the default initializer to go away though:</div><div><br></div><div>struct S {</div><div>    var int: Int</div><div>    var float: Float</div><div>    var bool: Bool</div><div>    </div><div>    /* convenience */ init(x: Int) {</div><div>        self.init(int: 0, float: 0, bool: false) // *** ERROR. this initializer is gone</div><div>    }</div><div>}</div><div><br></div><div>let s = S(x: 0)</div><div>let s = S(int: 0, float: 0, bool: false) // *** ERROR. this initializer is gone</div><div><br></div><div>this may be convenient in some cases but not others.</div><div>proposal: introduce an opt-in construct to keep the default initializer intact:</div><div><br></div><div>struct S {</div><div>    var int: Int</div><div>    var float: Float</div><div>    var bool: Bool</div><div>    </div><div>    default init // explicit opt-in. suggest a better name</div><div>    </div><div>    /* convenience */ init(x: Int) {</div><div>        self.init(int: 0, float: 0, bool: false) // still ok</div><div>    }</div><div>}</div><div><br></div><div>let s = S(x: 0) // ok</div><div>let s = S(int: 0, float: 0, bool: false) // still ok</div><div><br></div><div>    </div><div>***** proposal 2 *****</div><div>have the default initializer to have default nil values for all optional parameters in structs</div><div><br></div><div>struct S {<br></div><div>    var int: Int</div><div>    var float: Float?</div><div>    var bool: Bool</div><div>    </div><div>//  autogenerated:</div><div>//  init(int: Int, float: Float? = nil, bool: Bool) {</div><div>//      <a href="http://self.int/" target="_blank">self.int</a> = int</div><div>//      self.float = float</div><div>//      self.bool = bool</div><div>//  }</div><div>}</div><div><br></div><div>in the extreme case:</div><div><br></div><div>struct S5 {</div><div>    var int: Int?</div><div>    var float: Float?</div><div>    var bool: Bool?</div><div>    </div><div>//  autogenerated:</div><div>//  init(int: Int? = nil, float: Float? = nil, bool: Bool? = nil) {</div><div>//      <a href="http://self.int/" target="_blank">self.int</a> = int</div><div>//      self.float = float</div><div>//      self.bool = bool</div><div>//  }</div><div>}</div><div><br></div><div>usage:</div><div>S(float: 3)</div><div>S()</div><div>S(int: 0, float: 0, bool: false)</div><div><br></div><div>note that this is still &quot;opt-in&quot; as the old code will be using the full form anyway and not break.</div><div><br></div><div>***** proposal 3 *****</div><div>introduce a similar opt-in default initialiser for classes:</div><div><br></div><div>class C {</div><div>    var int: Int</div><div>    var float: Float?</div><div>    var bool: Bool</div><div>}</div><div><br></div><div>let c = C(int: 0, float: 0, bool: false) // *** ERROR</div><div><br></div><div>class C {</div><div>    var int: Int</div><div>    var float: Float?</div><div>    var bool: Bool</div><div>    </div><div>    default init // explicit opt-in. suggest a better name</div><div>    </div><div>//  this is autogenerated:</div><div>//  init(int: Int, float: Float? = nil, bool: Bool) {</div><div>//      <a href="http://self.int/" target="_blank">self.int</a> = int</div><div>//      self.float = float</div><div>//      self.bool = bool</div><div>//  }</div><div>}</div><div><br></div><div>let c = C(int: 0, bool: false) // ok</div><div><br></div><div><div><br></div><div>***** question 4 *****</div><div><br></div><div>this one is not a proposal, rather a question. probably there is a good reason for it, i just want to know it: why there is no default initializer for classes similar to what we have for structs?</div></div><div><br></div><div><br></div><div>==============================<wbr>===</div><div>thoughts and comments on any of these?</div><div><br></div><div>Mike</div><div><br></div></div></div></div>
______________________________<wbr>_________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br></div></blockquote></div><br></div><br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div>