<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">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">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">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">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>=================================</div><div>thoughts and comments on any of these?</div><div><br></div><div>Mike</div><div><br></div></div>