<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">1 can already be accomplished by moving the custom initializer into an extension.&nbsp;</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Jon</div><div><br class=""><blockquote type="cite" class=""><div class="">On Jun 21, 2017, at 7:42 PM, Mike Kluev 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 dir="ltr" class=""><div class="">hi. here are a few somewhat related initializer proposals for your consideration.</div><div class="">they are designed as "opt-ins" so shall not break existing code.</div><div class=""><br class=""></div><div class="">***** proposal 1 *****</div><div class="">have an ability to keep default initializers in structs</div><div class=""><br class=""></div><div class="">struct S {</div><div class="">&nbsp; &nbsp; var int: Int</div><div class="">&nbsp; &nbsp; var float: Float</div><div class="">&nbsp; &nbsp; var bool: Bool</div><div class="">}</div><div class=""><br class=""></div><div class="">here default initializer is currently generated:</div><div class=""><br class=""></div><div class="">struct S {</div><div class="">&nbsp; &nbsp; var int: Int</div><div class="">&nbsp; &nbsp; var float: Float</div><div class="">&nbsp; &nbsp; var bool: Bool</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">// &nbsp;autogenerated:</div><div class="">// &nbsp;init(int: Int, float: Float, bool: Bool) {</div><div class="">// &nbsp; &nbsp; &nbsp;<a href="http://self.int/" class="">self.int</a> = int</div><div class="">// &nbsp; &nbsp; &nbsp;self.float = float</div><div class="">// &nbsp; &nbsp; &nbsp;self.bool = bool</div><div class="">// &nbsp;}</div><div class="">}</div><div class=""><br class=""></div><div class="">so we can write:</div><div class=""><br class=""></div><div class="">let s = S(int: 0, float: 0, bool: false)</div><div class=""><br class=""></div><div class="">so far so good. now i want to add a "convenience" initializer. i don't want the default initializer to go away though:</div><div class=""><br class=""></div><div class="">struct S {</div><div class="">&nbsp; &nbsp; var int: Int</div><div class="">&nbsp; &nbsp; var float: Float</div><div class="">&nbsp; &nbsp; var bool: Bool</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">&nbsp; &nbsp; /* convenience */ init(x: Int) {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; self.init(int: 0, float: 0, bool: false) // *** ERROR. this initializer is gone</div><div class="">&nbsp; &nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">let s = S(x: 0)</div><div class="">let s = S(int: 0, float: 0, bool: false) // *** ERROR. this initializer is gone</div><div class=""><br class=""></div><div class="">this may be convenient in some cases but not others.</div><div class="">proposal: introduce an opt-in construct to keep the default initializer intact:</div><div class=""><br class=""></div><div class="">struct S {</div><div class="">&nbsp; &nbsp; var int: Int</div><div class="">&nbsp; &nbsp; var float: Float</div><div class="">&nbsp; &nbsp; var bool: Bool</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">&nbsp; &nbsp; default init // explicit opt-in. suggest a better name</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">&nbsp; &nbsp; /* convenience */ init(x: Int) {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; self.init(int: 0, float: 0, bool: false) // still ok</div><div class="">&nbsp; &nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">let s = S(x: 0) // ok</div><div class="">let s = S(int: 0, float: 0, bool: false) // still ok</div><div class=""><br class=""></div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">***** proposal 2 *****</div><div class="">have the default initializer to have default nil values for all optional parameters in structs</div><div class=""><br class=""></div><div class="">struct S {<br class=""></div><div class="">&nbsp; &nbsp; var int: Int</div><div class="">&nbsp; &nbsp; var float: Float?</div><div class="">&nbsp; &nbsp; var bool: Bool</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">// &nbsp;autogenerated:</div><div class="">// &nbsp;init(int: Int, float: Float? = nil, bool: Bool) {</div><div class="">// &nbsp; &nbsp; &nbsp;<a href="http://self.int/" class="">self.int</a> = int</div><div class="">// &nbsp; &nbsp; &nbsp;self.float = float</div><div class="">// &nbsp; &nbsp; &nbsp;self.bool = bool</div><div class="">// &nbsp;}</div><div class="">}</div><div class=""><br class=""></div><div class="">in the extreme case:</div><div class=""><br class=""></div><div class="">struct S5 {</div><div class="">&nbsp; &nbsp; var int: Int?</div><div class="">&nbsp; &nbsp; var float: Float?</div><div class="">&nbsp; &nbsp; var bool: Bool?</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">// &nbsp;autogenerated:</div><div class="">// &nbsp;init(int: Int? = nil, float: Float? = nil, bool: Bool? = nil) {</div><div class="">// &nbsp; &nbsp; &nbsp;<a href="http://self.int/" class="">self.int</a> = int</div><div class="">// &nbsp; &nbsp; &nbsp;self.float = float</div><div class="">// &nbsp; &nbsp; &nbsp;self.bool = bool</div><div class="">// &nbsp;}</div><div class="">}</div><div class=""><br class=""></div><div class="">usage:</div><div class="">S(float: 3)</div><div class="">S()</div><div class="">S(int: 0, float: 0, bool: false)</div><div class=""><br class=""></div><div class="">note that this is still "opt-in" as the old code will be using the full form anyway and not break.</div><div class=""><br class=""></div><div class="">***** proposal 3 *****</div><div class="">introduce a similar opt-in default initialiser for classes:</div><div class=""><br class=""></div><div class="">class C {</div><div class="">&nbsp; &nbsp; var int: Int</div><div class="">&nbsp; &nbsp; var float: Float?</div><div class="">&nbsp; &nbsp; var bool: Bool</div><div class="">}</div><div class=""><br class=""></div><div class="">let c = C(int: 0, float: 0, bool: false) // *** ERROR</div><div class=""><br class=""></div><div class="">class C {</div><div class="">&nbsp; &nbsp; var int: Int</div><div class="">&nbsp; &nbsp; var float: Float?</div><div class="">&nbsp; &nbsp; var bool: Bool</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">&nbsp; &nbsp; default init // explicit opt-in. suggest a better name</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">// &nbsp;this is autogenerated:</div><div class="">// &nbsp;init(int: Int, float: Float? = nil, bool: Bool) {</div><div class="">// &nbsp; &nbsp; &nbsp;<a href="http://self.int/" class="">self.int</a> = int</div><div class="">// &nbsp; &nbsp; &nbsp;self.float = float</div><div class="">// &nbsp; &nbsp; &nbsp;self.bool = bool</div><div class="">// &nbsp;}</div><div class="">}</div><div class=""><br class=""></div><div class="">let c = C(int: 0, bool: false) // ok</div><div class=""><br class=""></div><div class=""><div class=""><br class=""></div><div class="">***** question 4 *****</div><div class=""><br class=""></div><div class="">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 class=""><br class=""></div><div class=""><br class=""></div><div class="">=================================</div><div class="">thoughts and comments on any of these?</div><div class=""><br class=""></div><div class="">Mike</div><div class=""><br class=""></div></div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>