<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><blockquote type="cite" class=""><div class="">On Jan 11, 2016, at 9:34 AM, Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; wrote:</div><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 11, 2016, at 11:21 AM, John McCall &lt;<a href="mailto:rjmccall@apple.com" class="">rjmccall@apple.com</a>&gt; wrote:</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="">On Jan 10, 2016, at 7:44 PM, Matthew Johnson 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;"><div class="">I have always considered the Flexible Memberwise Initialization proposal to be just a first step (as evidenced by the many future enhancements it discussed). &nbsp;Its review has inspired new ideas and helped to shape my vision of the best long-term solution. &nbsp; &nbsp;My final thoughts about the review can be found here:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160104/006176.html" class="">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160104/006176.html</a></div><div class=""><br class=""></div><div class="">Partial initializers is the second in a series of three proposals describing general features that can work together to form a complete solution.</div><div class=""><br class=""></div><div class=""><div class="">The proposal drafts can be found at the following links:</div><div class=""><br class=""></div><div class="">*&nbsp;<b class="">Parameter forwarding:</b>&nbsp;<a href="https://github.com/anandabits/swift-evolution/blob/parameter-forwarding/proposals/NNNN-parameter-forwarding.md" class="">https://github.com/anandabits/swift-evolution/blob/parameter-forwarding/proposals/NNNN-parameter-forwarding.md</a></div><div class="">*&nbsp;<b class="">Partial initializers:</b>&nbsp;<a href="https://github.com/anandabits/swift-evolution/blob/partial-initializers/proposals/NNNN-partial-initializers.md" class="">https://github.com/anandabits/swift-evolution/blob/partial-initializers/proposals/NNNN-partial-initializers.md</a></div><div class="">*&nbsp;<b class="">Property lists:</b>&nbsp;<a href="https://github.com/anandabits/swift-evolution/blob/property-lists/proposals/NNNN-property-lists.md" class="">https://github.com/anandabits/swift-evolution/blob/property-lists/proposals/NNNN-property-lists.md</a></div></div><div class=""><br class=""></div><div class="">Matthew</div><div class=""><h1 id="partialinitializers" class="" style="font-size: 37px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Partial Initializers</h1><ul class="" style="margin-top: 21px; margin-bottom: 21px; padding-left: 1.5em; color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; font-size: 15px;"><li class="" style="font-size: 17px;">Proposal:&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-partial-initializers.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">SE-NNNN</a></li><li class="" style="font-size: 17px;">Author(s):&nbsp;<a href="https://github.com/anandabits" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Matthew Johnson</a></li><li class="" style="font-size: 17px;">Status:&nbsp;<strong class="" style="line-height: 1;">Awaiting review</strong></li><li class="" style="font-size: 17px;">Review manager: TBD</li></ul><h2 id="introduction" class="" style="color: rgb(17, 17, 17); font-size: 27px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Introduction</h2><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">This proposal introduces partial initializers. They perform part, but not all, of phase 1 initialization for a type. Partial initializers can only be called by designated initializers of the same type or other partial initializers of the same type.</p><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">Swift-evolution thread:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Proposal Draft: Partial Initializers</a></p><h2 id="motivation" class="" style="color: rgb(17, 17, 17); font-size: 27px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Motivation</h2><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">Partial initializers will make it much easier to factor out common initialization logic than it is today.</p><h3 id="memberwiseinitialization" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Memberwise initialization</h3><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">Partial initializers are a general feature that can work together with&nbsp;<a href="https://github.com/anandabits/swift-evolution/edit/parameter-forwarding/proposals/NNNN-parameter-forwarding.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Parameter Forwarding</a>&nbsp;and&nbsp;<a href="https://github.com/anandabits/swift-evolution/blob/property-lists/proposals/NNNN-property-lists.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Property Lists</a>&nbsp;to enable extremely flexible memberwise initialization.&nbsp;</p><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">The combination of partial initializers and parameter forwarding is sufficiently powerfule to replace the explicit memberwise initializers of the&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Flexible Memberwise Initialization</a>&nbsp;proposal by simply adding a three implicit partial initializers.</p><h3 id="extensionswithstoredproperties" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Extensions with stored properties</h3><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">Partial initialization is an enabling feature for stored properties in class extensions. Extension with stored properties would be required to have a designated initializer. That extension initializer would effectively be treated as a partial initializer by designated initializers of the class.&nbsp;</p><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">John McCall&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151221/004479.html" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">briefly described</a>&nbsp;how this might work in the mailing list thread discussing extensions with stored properties.&nbsp;</p><h2 id="proposedsolution" class="" style="color: rgb(17, 17, 17); font-size: 27px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Proposed solution</h2><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">The proposed solution is to introduce a&nbsp;<code class="" style="line-height: 1;">partial</code>&nbsp;declaration modifier for initializers.&nbsp;</p><ol class="" style="margin-top: 21px; margin-bottom: 21px; padding-left: 1.5em; color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; font-size: 15px;"><li class="" style="font-size: 17px;"><div class="" style="word-wrap: break-word; margin: 0px; line-height: 1.3125em;">When this declaration modifier is present the entire body of the initializer must comply with phase 1 initialization. It is possible for a partial initializer to initialize all stored properties but it is not possible for a partial initializer to call a&nbsp;<code class="" style="line-height: 1;">super</code>&nbsp;initializer.</div></li><li class="" style="font-size: 17px;"><div class="" style="word-wrap: break-word; margin: 0px; line-height: 1.3125em;">Partial initializers can only be called during phase 1 of initialization by another partial initalizer of the same type, by a designated initializer of the same type, or by another struct initializer of the same type.</div></li><li class="" style="font-size: 17px;"><div class="" style="word-wrap: break-word; margin: 0px; line-height: 1.3125em;">The compiler keeps track of the properties initialized by a call to a partial initializer and uses that knowledge when enforcing initialization rules in phase 1 in the calling initializer.</div></li><li class="" style="font-size: 17px;"><div class="" style="word-wrap: break-word; margin: 0px; line-height: 1.3125em;">Partial initializers receive an identifier, which avoids the need to rely on overloading to differentiate between partial initializers.</div></li></ol></div></div></div></blockquote><div class="">That’s interesting. &nbsp;This is also a syntactic for partial deinit, I suppose, although that seems pointless outside of class extensions (and even then it’s suspect). &nbsp;I guess it’s clear enough what’s happening because the .init suffix is not normally writable.</div></div></div></blockquote></div></div></div></blockquote><div><br class=""></div>What are the rules on this identifier? &nbsp;Does it have to be unique, or can partial initializers also be overloaded? &nbsp;What do you expect to do for extensions?<br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class=""><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=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><ol class="" start="5" style="margin-top: 21px; margin-bottom: 21px; padding-left: 1.5em; color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; font-size: 15px;"><li class="" style="font-size: 17px;"><div class="" style="word-wrap: break-word; margin: 0px; line-height: 1.3125em;">Struct partial initializers are allowed to include an access control modifier specifying their visibility. They can be called in any initializer of the same type where they are visible.</div></li><li class="" style="font-size: 17px;"><div class="" style="word-wrap: break-word; margin: 0px; line-height: 1.3125em;">Class partial initializers are always private. This is because they can only be declared in the main body of a class and can only be called by a designated initializer of the same type.</div></li></ol></div></div></div></blockquote><div class="">So you’re explicitly forbidding the class-extension use case I had described as the major motivation for this feature.</div></div></div></blockquote><div class=""><br class=""></div><div class="">No, this proposal is just introducing the feature into the current language. &nbsp;I consider introducing the class-extension use case to be part of a new proposal. &nbsp;That said, if you felt like it should be introduced in this proposal (presumably along with stored properties in extensions) we could do that.</div></div></div></div></blockquote><div><br class=""></div>Oh, of course, you’re absolutely right. &nbsp;That’s a reasonable approach, but understand that this is basically a completely different feature, in terms of both its expected uses and its implementation, from partial initialization of class extensions. &nbsp;The only similarity is syntax. &nbsp;It would abstractly be reasonable to independently decide that one of these features isn’t a good idea, isn’t worth the complexity, or is simply out of scope.</div><div><br class=""></div><div>Also, I think it wouldn’t hurt for this proposal to be more explicit about how you expect it to interact with other proposals. &nbsp;You say that it combines well with memberwise initializers; okay, I think I see where you’re going with that, but spell it out, please. &nbsp;Similarly, a brief section outlining how you expect this to work with stored properties in extensions would not be out of place, and this line in particular should call out the fact that it will change if stored properties are added to other contexts.</div><div><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class=""><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=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><ol class="" start="7" style="margin-top: 21px; margin-bottom: 21px; padding-left: 1.5em; color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; font-size: 15px;"><li class="" style="font-size: 17px;"><div class="" style="word-wrap: break-word; margin: 0px; line-height: 1.3125em;">There is no restriction on the order in which the partial initializers are called aside from the rule that the can only be called during phase 1 of initialization and the rule that a&nbsp;<code class="" style="line-height: 1;">let</code>&nbsp;property must be initialized once and only once during phase 1.</div></li></ol></div></div></div></blockquote>Any initialization proposal needs to be explicit about the new rules it’s proposing for definitive initialization. &nbsp;How are partial initializers checked? &nbsp;What properties can be accessed within them? &nbsp;How do calls to them fit into other checking?<br class=""></div></div></blockquote><div class=""><br class=""></div><div class="">Agree. &nbsp;Detailed design is still open. &nbsp;Here’s the basic idea:</div><div class=""><br class=""></div><div class="">1. A partial initializer can initialize any subset of stored properties.</div><div class="">2. A partial initializer can only read a property it initializes itself.</div><div class="">3. If an initializer initializes a `let` property it cannot call a partial initializer that also initializes that property.</div></div></div></div></blockquote><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><div class="">4. After calling a partial initializer, the properties it initialized are considered initialized in the calling initializer as well. &nbsp;They can be read from, etc.</div><div class=""><br class=""></div>Partial initializers themselves are not “checked” per-se. &nbsp;The compiler would keep track of the properties they initialize and use that information when checking the calling initializer (for duplicate `let` assignments, complete initialization, etc).</div></div></div></blockquote><div><br class=""></div>Okay. &nbsp;This requires a simple dependency-ordering pass among partial initializers, but that should be straightforward to do.</div><div><br class=""></div><div>The model will be much simpler if you ban redundant assignments to ‘var’ properties as well.</div><div><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class=""><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=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><h3 id="basicexample" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Basic example</h3><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">struct</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">S</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> a, b, <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>, d: <span class="hljs-type">Int</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> bAndC(i: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>) {
    b = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>
    <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>
  }
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>) {
    a = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">2</span>
    d = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">4</span>
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>()
  }
}</code></pre></div></div></div></blockquote><div class="">Interesting. &nbsp;So partial initializers in the main declaration provide a way to abstract out common initializer logic from multiple initializers without creating a separate initializer. &nbsp;We otherwise don't have this because (1) you cannot call methods during phase 1 of initialization and (2) we do not do the appropriate DI-checking in a method. &nbsp;I think that’s potentially very useful for classes with a lot of complex initialization logic.</div></div></div></blockquote><div class=""><br class=""></div><div class="">Agree. &nbsp;It is a generally useful initialization feature and also paves the way for stored properties declared outside the main body of the type.</div><div class=""><br class=""></div><div class="">It combines really well with syntactic sugar to forward parameters directly from a primary to a partial initializer as well as sugar for concise declaration of trivial partial memberwise initializers.</div></div></div></div></blockquote><div><br class=""></div>Sure. &nbsp;I’m just asking you to spell it out.</div><div><br class=""></div><div>John.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><div class=""><br class=""></div><div class="">Matthew</div><br class=""><blockquote type="cite" class=""><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=""><div class=""><br class=""></div><div class="">John.</div><br class=""><blockquote type="cite" class=""><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><h3 id="callingmultiplepartialinitializers" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Calling multiple partial initializers</h3><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">struct</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">S</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> a, b, <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>, d: <span class="hljs-type">Int</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> bAndC() {
    b = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>
    <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>
  }
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> configureD(i: <span class="hljs-type">Int</span>) {
    d = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">4</span>
  }
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>) {
    configureD.<span class="hljs-keyword" style="font-weight: bold;">init</span>(i)
    a = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">2</span>
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>()
  }
}</code></pre><h3 id="onepartialinitcallinganother" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">One partial init calling another</h3><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">struct</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">S</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> a, b, <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>, d: <span class="hljs-type">Int</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> bAndC() {
    b = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>
    <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>
  }
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> bcAndD(i: <span class="hljs-type">Int</span>) {
    d = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">4</span>
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>()
  }
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>) {
    a = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">2</span>
    bcAndD.<span class="hljs-keyword" style="font-weight: bold;">init</span>(i)
  }
}</code></pre><h3 id="syntacticsugarforforwarding" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Syntactic sugar for forwarding</h3><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">It will be a common use case to factor out some common initialization logic using a partial initializer. Often the parameters for the partial initializer will simply be forwarded.&nbsp;</p><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">Syntactic sugar is provided to streamline this use case. It matches the placeholder syntax of the&nbsp;<a href="https://github.com/anandabits/swift-evolution/blob/parameter-forwarding/proposals/NNNN-parameter-forwarding.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">parameter forwarding proposal</a>, with the placeholder identifier matching the name of a partial initializer. The implementation of forwarding matches the implementation of the parameter forwarding proposal.</p><h4 id="basicforwardingsugarexample" class="" style="color: rgb(17, 17, 17); font-size: 20px; line-height: 21px; margin-top: 21px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Basic forwarding sugar example</h4><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">struct</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">S</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> a, b, <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>, d: <span class="hljs-type">Int</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> bAndC(b: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>, cLabel <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>) {
    b = b
    <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span> = <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user writes</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>, ...bAndC) {
    a = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">2</span>
    d = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">4</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>, b: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>, cLabel: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>) {
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>(b: b, cLabel: cLabel)
    a = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">2</span>
    d = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">4</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// equivalent to writing the following under the parameter forwarding proposal:</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// <span class="hljs-doctag">NOTE:</span> the placeholder identifier is changed to `bAndCParams` here to avoid</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// conflict with the name of the partial initializer itself</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>, ...bAndCParams) {
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>(...bAndCParams)
    a = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">2</span>
    d = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">4</span>
  }
}</code></pre><h4 id="forwardingtomorethanonepartialinitializer" class="" style="color: rgb(17, 17, 17); font-size: 20px; line-height: 21px; margin-top: 21px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Forwarding to more than one partial initializer</h4><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">struct</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">S</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> a, b, <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>, d: <span class="hljs-type">Int</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> bAndC(b: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>, cLabel <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>) {
    b = b
    <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span> = <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>
  }
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> aAndD(i: <span class="hljs-type">Int</span>) {
    a = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>
    d = i * <span class="hljs-number" style="color: rgb(0, 153, 153);">100</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user writes</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(...aAndD, ...bAndC) {}
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>, b: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>, cLabel: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>) {
    aAndD.<span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>)
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>(b: b, cLabel: cLabel)
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// equivalent to writing the following under the parameter forwarding proposal:</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// <span class="hljs-doctag">NOTE:</span> the placeholder identifier is changed to `bAndCParams` here to avoid</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// conflict with the name of the partial initializer itself</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(...aAndDParams, ...bAndCParams) {
    aAndD.<span class="hljs-keyword" style="font-weight: bold;">init</span>(...aAndDParams)
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>(...bAndCParams)
  }
}</code></pre><h4 id="onepartialinitizerforwardingtoanother" class="" style="color: rgb(17, 17, 17); font-size: 20px; line-height: 21px; margin-top: 21px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">One partial initizer forwarding to another</h4><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">struct</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">S</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> a, b, <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>, d: <span class="hljs-type">Int</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> bAndC(b: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>, cLabel <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>) {
    b = b
    <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span> = <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user writes</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> abAndC(...bAndC) {
    a = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> abAndC(b: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">10</span>, cLabel <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">20</span>) {
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>(b: b, <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>: <span class="hljs-built_in" style="color: rgb(0, 134, 179);">c</span>)
    a = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// equivalent to writing the following under the parameter forwarding proposal:</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// <span class="hljs-doctag">NOTE:</span> the placeholder identifier is changed to `bAndCParams` here to avoid</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// conflict with the name of the partial initializer itself</span>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> abAndC(i: <span class="hljs-type">Int</span>, ...bAndCParams) {
    bAndC.<span class="hljs-keyword" style="font-weight: bold;">init</span>(...bAndCParams)
    a = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  }
}</code></pre><h4 id="forwardingtosuper" class="" style="color: rgb(17, 17, 17); font-size: 20px; line-height: 21px; margin-top: 21px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Forwarding to super</h4><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">If super contains a single designated initializer subclasses can use the same syntax to forward parameters to the super initializer. The call to super is added at the end of the initializer body. This means that if phase 2 initialization logic is necessary it will not be possible to use the syntactic sugar.</p><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">Base</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>, s: <span class="hljs-type">String</span>, f: <span class="hljs-type">Float</span>) {}
}

<span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">Derived</span>: <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">Base</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> d: <span class="hljs-type">Double</span>
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user writes</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(...<span class="hljs-keyword" style="font-weight: bold;">super</span>) {
    d = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>, s: <span class="hljs-type">String</span>, f: <span class="hljs-type">Float</span>) {
    d = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
    <span class="hljs-keyword" style="font-weight: bold;">super</span>.<span class="hljs-keyword" style="font-weight: bold;">init</span>(i: i, s: s, f: f)
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// equivalent to writing the following under the parameter forwarding proposal:</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(...superParams) {
    d = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
    <span class="hljs-keyword" style="font-weight: bold;">super</span>.<span class="hljs-keyword" style="font-weight: bold;">init</span>(...superParams)
  }
}</code></pre><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">If super contains more than one initializer</p><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;"><span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">struct</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">S</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> i: <span class="hljs-type">Int</span>, s: <span class="hljs-type">String</span>, f: <span class="hljs-type">Float</span>
}

<span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">Base</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(s: <span class="hljs-type">S</span>) {}
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(i: <span class="hljs-type">Int</span>, s: <span class="hljs-type">String</span>, f: <span class="hljs-type">Float</span>) {}
}

<span class="hljs-class"><span class="hljs-keyword" style="font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">Derived</span>: <span class="hljs-title" style="color: rgb(68, 85, 136); font-weight: bold;">Base</span> </span>{
  <span class="hljs-keyword" style="font-weight: bold;">let</span> d: <span class="hljs-type">Double</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// error: ambiguous forward to super</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(...<span class="hljs-keyword" style="font-weight: bold;">super</span>) {} 
}</code></pre><h3 id="implicitpartialinitializers" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Implicit partial initializers</h3><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">Three implicit paritial initializers exist. They match the behavior of&nbsp;<code class="" style="line-height: 1;">public</code>,&nbsp;<code class="" style="line-height: 1;">internal</code>, and&nbsp;<code class="" style="line-height: 1;">private</code>&nbsp;memberwise intializers using the automatic property eligibility model described in the&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Flexible Memberwise Initialization</a>&nbsp;proposal, thus making that proposal obsolete if this proposal is accepted. The&nbsp;<code class="" style="line-height: 1;">private</code>&nbsp;and&nbsp;<code class="" style="line-height: 1;">internal</code>&nbsp;implicit partial initializers also match the behavior of the implicit memberwise initializer if one exists for the type.</p><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px;"><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); height: auto;">  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// flexibile memberwise initialization proposal:</span>
  <span class="hljs-keyword" style="font-weight: bold;">public</span> memberwise <span class="hljs-keyword" style="font-weight: bold;">init</span>(...) {
    <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// init all private an internal props</span>
  }
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// corresponding syntax using implicit partial init and forwarding:</span>
  <span class="hljs-keyword" style="font-weight: bold;">public</span> <span class="hljs-keyword" style="font-weight: bold;">init</span>(...publicMemberwise) {
    <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// init all private an internal props</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// flexibile memberwise initialization proposal:</span>
  memberwise <span class="hljs-keyword" style="font-weight: bold;">init</span>(...) {
    <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// init all private props</span>
  }
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// corresponding syntax using implicit partial init and forwarding:</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(...internalMemberwise) {
    <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// init all private props</span>
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// flexibile memberwise initialization proposal:</span>
  <span class="hljs-keyword" style="font-weight: bold;">private</span> memberwise <span class="hljs-keyword" style="font-weight: bold;">init</span>(...) {}
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// corresponding syntax using implicit partial init and forwarding:</span>
  <span class="hljs-keyword" style="font-weight: bold;">private</span> <span class="hljs-keyword" style="font-weight: bold;">init</span>(...privateMemberwise) {}</code></pre><h2 id="detaileddesign" class="" style="color: rgb(17, 17, 17); font-size: 27px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Detailed design</h2><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">TODO but should fall out pretty clearly from the proposed solution</p><h2 id="impactonexistingcode" class="" style="color: rgb(17, 17, 17); font-size: 27px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Impact on existing code</h2><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">This is a strictly additive change. It has no impact on existing code.</p><h2 id="alternativesconsidered" class="" style="color: rgb(17, 17, 17); font-size: 27px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Alternatives considered</h2><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">I believe the basic structure of partial initialization falls naturally out of the current initialization rules.</p><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">The syntax for declaring and invoking partial initializers is game for bikeshedding.</p><h3 id="memberscomputedtupleproperty" class="" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;">Members computed tuple property</h3><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">Joe Groff posted the idea of using a&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160104/005619.html" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;"><code class="" style="line-height: 1;">members</code>&nbsp;computed tuple property</a>&nbsp;during the review of the&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Flexible Memberwise Initialization</a>&nbsp;proposal. The ensuing discussion inspired me to think more deeply about how more general features could support the memberwise initialization use case. That line of thinking eventually led me to create this proposal as well as the&nbsp;<a href="https://github.com/anandabits/swift-evolution/blob/partial-initializers/proposals/https://github.com/anandabits/swift-evolution/blob/property-lists/proposals/NNNN-property-lists.md" class="" style="color: rgb(13, 110, 161); text-decoration: none; -webkit-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out;">Property Lists</a>&nbsp;proposal.</p><p class="" style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;">There are a few problems with the&nbsp;<code class="" style="line-height: 1;">members</code>&nbsp;computed tuple approach:</p><ol class="" style="margin-top: 21px; margin-bottom: 21px; padding-left: 1.5em; color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; font-size: 15px;"><li class="" style="font-size: 17px;">It uses a computed property setter to initialize&nbsp;<code class="" style="line-height: 1;">let</code>&nbsp;properties. This is not something you can do in manually written code and just feels wrong. Initialization, especially of&nbsp;<code class="" style="line-height: 1;">let</code>&nbsp;properties, but also the first&nbsp;<code class="" style="line-height: 1;">set</code>&nbsp;of a&nbsp;<code class="" style="line-height: 1;">var</code>&nbsp;property, should happen in an initilizer context. Partial initializers allow for that in a much more elegant fashion than a weird special case property with a setter that is kind of an initializer.</li><li class="" style="font-size: 17px;">The question of how to expose default property values in initializer parameters was never answered.</li><li class="" style="font-size: 17px;">The question of how to provide memberwise initialization for a subset of properties was never answered.</li></ol><div class=""><br class=""></div></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=hWKWvOREWCPT32eVzNXOV7yIWXgGOvlMtgjKbOieJnZkxU7AfCNcONL0bcq2wKL1k236NeLA6YzVGX6vyfRzMaGVx-2Fodic4Utzwhk7vAWMAJadh-2BW5EhwmTsl-2Btvlet1nev4tWohkW00gHdKPePmLQ3RNaK9K8XVHe5qhw7D9O1dM54qg3FvPqy1i4-2FAzPpcalk-2Bks8gsM-2Fg8zx7fpSdGAdHq8DurAvl5LWPJrhdiMs-3D" alt="" width="1" height="1" border="0" class="" style="height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;"></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></body></html>