<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="">Hi Matthew,</div><div class=""><br class=""></div><div class="">Just a few quick comments:</div><div class=""><br class=""></div><div class=""><b class="">propertylist:</b></div><div class="">Not a big fan of the name either, `propertyalias` came to mind but that sounds like it's only for a single property.</div><div class=""><br class=""></div><div class=""><b class="">@propertylist:</b></div><div class="">I think this is mostly redundant and the proposal would be improved by its removal.</div><div class=""><br class=""></div><div class=""><b class="">propertylist syntax:</b></div><div class="">I don't think the current syntax. Using `:` feels wrong as I instinctively expect a type to it's right.</div><div class=""><br class=""></div><div class="">How about: `propertylist fooProps = &nbsp;(aProp, bProp)`</div><div class=""><br class=""></div><div class=""><b class="">Default values in&nbsp;propertylist:</b></div><div class="">Strongly against this. Only applicable to initializer use case and feels generally out of place.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">I have also looked at the other two related proposals but I'm far from having a final opinion on any of the three.</div><div class="">I'm also posting my current very short and very rough impressions of the three related proposals here as I feel they are strongly related and I don't have enough to say about the other two to really justify separate posts:</div><div class=""><br class=""></div><div class=""><b class="">Parameter forwarding:</b></div><div class="">This is the proposal I like the least. I'm not a fan of the syntax and it mostly saves some minor typing at the cost immediately knowing what the actual arguments are.</div><div class=""><br class=""></div><div class=""><b class="">Partial initializers:</b></div><div class="">My dislike of parameter forwarding carries over to this but otherwise I find the basic idea quite nice.</div><div class="">My bigger issue here is that I currently don't see a huge use case for this that isn't already served by initializer delegation. Yes this seems to cover additional cases but I'm not sure it justifies it's existence. It makes a lot more sense when considered as part of the memberwise initialization trifecta with parameter forwarding but like I said that's the part I don't really like.</div><div class=""><br class=""></div><div class=""><b class="">Property Lists:</b></div><div class="">Like with partial initializers I find this to be an interesting idea and this seems to have other potential use cases apart from memberwise initialization. Then again I'm unsure if this exact proposal is the way to go here. I'd really prefer to see more abstract discussion of this idea before committing to any specifics.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Particularly here but also in general for all three proposals I feel that we might be better served by letting the language form further and waiting for more general pieces to fall into place before charging ahead in these areas. None of these require stopgap solutions from my point of view and I at least feel like I could evaluate this much better once I have an idea of what Swift is going to look like at version 4, 5, ...</div><div class="">From reading the Swift team's comments it seems like future improvements like variadic generics might make a potential difference here and I imagine the macro system might as well.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">I hope this doesn't sound too negative, you clearly invested a significant amount of work into these proposals and I value the effort. It helps me better understand the problems people see and what potential solutions might look like and stirs a lot of healthy discussion.</div><div class="">So don't let yourself be discouraged if I don't feel that changes in this area are required just yet :-)</div><div class=""><br class=""></div><div class="">- Janosch</div><br class=""><div><blockquote type="cite" class=""><div class="">On 11 Jan 2016, at 04:44, 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=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><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="">Property lists is the third 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="propertylists" style="font-size: 37px; line-height: 42px; margin-top: 42px; margin-bottom: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;" class="">Property Lists</h1><ul 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;" class=""><li style="font-size: 17px;" class="">Proposal:&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-property-lists.md" style="color: rgb(13, 110, 161); text-decoration: none; transition: color 0.2s ease-in-out; -webkit-transition: color 0.2s ease-in-out;" class="">SE-NNNN</a></li><li style="font-size: 17px;" class="">Author(s):&nbsp;<a href="https://github.com/anandabits" style="color: rgb(13, 110, 161); text-decoration: none; transition: color 0.2s ease-in-out; -webkit-transition: color 0.2s ease-in-out;" class="">Matthew Johnson</a></li><li style="font-size: 17px;" class="">Status:&nbsp;<strong style="line-height: 1;" class="">Awaiting review</strong></li><li style="font-size: 17px;" class="">Review manager: TBD</li></ul><h2 id="introduction" 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;" class="">Introduction</h2><p 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;" class="">This proposal introduces the&nbsp;<code style="line-height: 1;" class="">propertylist</code>&nbsp;declaration. Property lists provide concise syntactic sugar for declaring memberwise partial initializers and memberwise computed tuple properties.</p><p 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;" class="">NOTE: I do not love the name “property lists” for the feature or the keyword but haven’t thought of anything better. Suggestions are welcome.</p><p 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;" class="">Swift-evolution thread:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution" style="color: rgb(13, 110, 161); text-decoration: none; transition: color 0.2s ease-in-out; -webkit-transition: color 0.2s ease-in-out;" class="">Proposal Draft: Property Lists</a></p><h2 id="motivation" 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;" class="">Motivation</h2><p 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;" class="">I believe the review of the&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md" style="color: rgb(13, 110, 161); text-decoration: none; transition: color 0.2s ease-in-out; -webkit-transition: color 0.2s ease-in-out;" class="">Flexible Memberwise Initialization</a>&nbsp;proposal demonstrated a strong demand for concise yet flexible memberwise initialization. The discussion highlighted several areas where that proposal fell short:</p><ol 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;" class=""><li style="font-size: 17px;" class="">Clarity regarding which parameters receive memberwise initialization.</li><li style="font-size: 17px;" class="">Control over which parameters receive memberwise initialization.</li><li style="font-size: 17px;" class="">Control over specific memberwise parameter ordering.</li><li style="font-size: 17px;" class="">Control over parameter labels.</li><li style="font-size: 17px;" class="">Control over default parameter values, especially for&nbsp;<code style="line-height: 1;" class="">let</code>&nbsp;properties.</li><li style="font-size: 17px;" class="">It is a very narrow, special case feature.</li></ol><p 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;" class="">This proposal builds on the&nbsp;<a href="https://github.com/anandabits/swift-evolution/blob/partial-initializers/proposals/NNNN-partial-initializers.md" style="color: rgb(13, 110, 161); text-decoration: none; transition: color 0.2s ease-in-out; -webkit-transition: color 0.2s ease-in-out;" class="">Partial Initializer</a>&nbsp;proposal to solve these problems using a more general underlying mechanism. It enables truly flexible memberwise initialization.&nbsp;</p><p 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;" class="">Property lists also support other memberwise features, beginning with memberwise computed tuple properties.</p><h2 id="proposedsolution" 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;" class="">Proposed solution</h2><p 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;" class="">There are two ways to specify a property list. The basic mechanism is a property list declaration that looks as follows:&nbsp;</p><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); height: auto;">  propertylist configProperties: aPropName, customLabel anotherPropName = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span></code></pre><p 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;" class="">All properties mentioned in the property list declaration must be visible at the site of the declaration.</p><p 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;" class="">A&nbsp;<code style="line-height: 1;" class="">propertylist</code>&nbsp;attribute also exists for property declarations to support cases where a list of property declarations should also be treated as a property list:</p><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); height: auto;">  @propertylist(aPropertyListIdentifier) <span class="hljs-keyword" style="font-weight: bold;">let</span> prop1, prop2: <span class="hljs-type">Int</span></code></pre><p 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;" class="">A property list can contain any kind of property, including those with behaviors. However, when certain kinds of properties are included it will not be possible to synthesize a partial memberwise initializer and / or a setter for the computed tuple property.</p><h3 id="synthesizedelements" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;" class="">Synthesized elements</h3><p 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;" class="">A typealias will always be synthesized:</p><ol 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;" class=""><li style="font-size: 17px;" class="">It will have a name matching the identifier of the property list, with the first character transformed to upper case.</li><li style="font-size: 17px;" class="">It will be a tuple type containing labels and types matching those specified in the property list.</li></ol><p 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;" class="">A computed tuple property will always be synthesized:</p><ol 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;" class=""><li style="font-size: 17px;" class="">It will always include a getter.</li><li style="font-size: 17px;" class="">Visibility of the getter will match the visibility of the least visible getter.</li><li style="font-size: 17px;" class="">It will contain a setter as long as all of the properties are settable.</li><li style="font-size: 17px;" class="">Visibility of the setter will match the visibility of the least visible setter.</li></ol><p 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;" class="">A paritial initializer will only be generated if:</p><ol 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;" class=""><li style="font-size: 17px;" class="">All properties are stored properties.</li><li style="font-size: 17px;" class="">None are&nbsp;<code style="line-height: 1;" class="">let</code>&nbsp;properties with an initial value.</li><li style="font-size: 17px;" class="">None have a behavior which is incompatible with phase 1 initialization.</li><li style="font-size: 17px;" class="">Visibility of the partial initializer will match the least visible setter for structs. Partial initializers for classes are always private (as specified by the partial initializer proposal).</li><li style="font-size: 17px;" class="">The property list is declared in the main body of the type, not an extension,&nbsp;<strong style="line-height: 1;" class="">unless</strong>&nbsp;the type is a struct.</li><li style="font-size: 17px;" class="">If stored properties are allowed in extensions and / or protocols in the future, all properties included in the list must be declared within the same body as the property list for a partial initializer to be synthesized (either the main body of the type or the body of the same extension or same protocol).</li></ol><p 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;" class="">The structure of the synthesized elements is as follows:</p><ol 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;" class=""><li style="font-size: 17px;" class="">Ordering of partial initializer parameters and tuple members will match the order of the property list declaration.</li><li style="font-size: 17px;" class="">The external parameter labels and tuple labels will match the label specified in the property list if it exists and the property name otherwise.</li><li style="font-size: 17px;" class="">The default value for partial initializer parameters will be the default value specified in the property list if it exists and the initial value of the property otherwise (if that exists). If neither exist the parameter will not have a default value.</li></ol><p 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;" class="">Visibility of a synthesized members is capped at&nbsp;<code style="line-height: 1;" class="">internal</code>&nbsp;unless&nbsp;<code style="line-height: 1;" class="">public</code>&nbsp;is explicitly specified. If&nbsp;<code style="line-height: 1;" class="">public</code>&nbsp;(or&nbsp;<code style="line-height: 1;" class="">internal</code>) is explicitly specified, all properties referenced must have getter and setter visibility of&nbsp;<strong style="line-height: 1;" class="">at least</strong>&nbsp;the specified access level or a compiler error will result.</p><h3 id="examples" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;" class="">Examples</h3><h4 id="basicexample" 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;" class="">Basic example</h4><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); height: auto;"><span class="hljs-keyword" style="font-weight: bold;">public</span> <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> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  <span class="hljs-keyword" style="font-weight: bold;">public</span> <span class="hljs-keyword" style="font-weight: bold;">var</span> s: <span class="hljs-type">String</span> = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</span>
  <span class="hljs-keyword" style="font-weight: bold;">public</span> <span class="hljs-keyword" style="font-weight: bold;">var</span> d: <span class="hljs-type">Double</span>
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user declares:</span>
  <span class="hljs-keyword" style="font-weight: bold;">public</span> propertylist custom: dLabel d = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>, s
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes:</span>
  <span class="hljs-keyword" style="font-weight: bold;">public</span> <span class="hljs-keyword" style="font-weight: bold;">typealias</span> <span class="hljs-type">Custom</span> = (dLabel: <span class="hljs-type">Double</span>, s: <span class="hljs-type">String</span>)
  <span class="hljs-keyword" style="font-weight: bold;">public</span> <span class="hljs-keyword" style="font-weight: bold;">var</span> custom: <span class="hljs-type">Custom</span> {
    <span class="hljs-keyword" style="font-weight: bold;">get</span> { <span class="hljs-keyword" style="font-weight: bold;">return</span> (dLabel: d, s: s) }
    <span class="hljs-keyword" style="font-weight: bold;">set</span> { (d, s) = newValue }
  }
  <span class="hljs-keyword" style="font-weight: bold;">public</span> partial <span class="hljs-keyword" style="font-weight: bold;">init</span> custom(dlabel d: <span class="hljs-type">Double</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>, s: <span class="hljs-type">String</span> = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</span>) {
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.d = d
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.s = s
  }
}</code></pre><h4 id="includingaletwithainitialvalue" 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;" class="">Including a let with a initial value</h4><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); 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> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  <span class="hljs-keyword" style="font-weight: bold;">let</span> s: <span class="hljs-type">String</span> = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</span>
  <span class="hljs-keyword" style="font-weight: bold;">var</span> d: <span class="hljs-type">Double</span>
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user declares:</span>
  propertylist custom: dLabel d, s
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes:</span>
  <span class="hljs-keyword" style="font-weight: bold;">typealias</span> <span class="hljs-type">Custom</span> = (dLabel: <span class="hljs-type">Double</span>, s: <span class="hljs-type">String</span>)
  <span class="hljs-keyword" style="font-weight: bold;">var</span> custom: <span class="hljs-type">Custom</span> {
    <span class="hljs-keyword" style="font-weight: bold;">get</span> { <span class="hljs-keyword" style="font-weight: bold;">return</span> (dLabel: d, s: s) }
  }
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// <span class="hljs-doctag">NOTE:</span> no setter because a `let` was included</span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// and no partial initializer because the `let` </span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// has an initial value.</span>
}</code></pre><h4 id="includingalazyproperty" 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;" class="">Including a lazy property</h4><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); 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>
  <span class="hljs-keyword" style="font-weight: bold;">var</span> s: <span class="hljs-type">String</span>
  <span class="hljs-built_in" style="color: rgb(0, 134, 179);">lazy</span> <span class="hljs-keyword" style="font-weight: bold;">var</span> d: <span class="hljs-type">Double</span>
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user declares:</span>
  propertylist custom: dLabel d, s
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes:</span>
  <span class="hljs-keyword" style="font-weight: bold;">typealias</span> <span class="hljs-type">Custom</span> = (dLabel: <span class="hljs-type">Double</span>, s: <span class="hljs-type">String</span>)
  <span class="hljs-keyword" style="font-weight: bold;">var</span> custom: <span class="hljs-type">Custom</span> {
    <span class="hljs-keyword" style="font-weight: bold;">get</span> { <span class="hljs-keyword" style="font-weight: bold;">return</span> (dLabel: d, s: s) }
    <span class="hljs-keyword" style="font-weight: bold;">set</span> { (d, s) = newValue }
  }
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// <span class="hljs-doctag">NOTE:</span> no partial initializer because a `lazy var` was included.</span>
}</code></pre><h4 id="includingavarwithaprivatesetter" 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;" class="">Including a&nbsp;<code style="line-height: 1;" class="">var</code>&nbsp;with a private setter</h4><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); 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>
  <span class="hljs-keyword" style="font-weight: bold;">var</span> s: <span class="hljs-type">String</span>
  <span class="hljs-keyword" style="font-weight: bold;">private</span>(<span class="hljs-keyword" style="font-weight: bold;">set</span>) <span class="hljs-keyword" style="font-weight: bold;">var</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;">// user declares:</span>
  propertylist custom: dLabel d, s = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</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;">typealias</span> <span class="hljs-type">Custom</span> = (dLabel: <span class="hljs-type">Double</span>, s: <span class="hljs-type">String</span>)
  <span class="hljs-keyword" style="font-weight: bold;">private</span>(<span class="hljs-keyword" style="font-weight: bold;">set</span>) <span class="hljs-keyword" style="font-weight: bold;">var</span> custom: <span class="hljs-type">Custom</span> {
    <span class="hljs-keyword" style="font-weight: bold;">get</span> { <span class="hljs-keyword" style="font-weight: bold;">return</span> (dLabel: d, s: s) }
    <span class="hljs-keyword" style="font-weight: bold;">set</span> { (d, s) = newValue }
  }
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// <span class="hljs-doctag">NOTE:</span> The initial value for `d` is used as a default </span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// parameter value because a different default parameter value </span>
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// was not specified.</span>
  <span class="hljs-keyword" style="font-weight: bold;">private</span> partial <span class="hljs-keyword" style="font-weight: bold;">init</span> custom(dlabel d: <span class="hljs-type">Double</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>, s: <span class="hljs-type">String</span> = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</span>) {
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.d = d
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.s = s
  }
}</code></pre><h4 id="includingacomputedproperty" 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;" class="">Including a computed property</h4><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); 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>
  <span class="hljs-keyword" style="font-weight: bold;">var</span> s: <span class="hljs-type">String</span>
  <span class="hljs-keyword" style="font-weight: bold;">var</span> d: <span class="hljs-type">Double</span> {
    <span class="hljs-keyword" style="font-weight: bold;">get</span> { <span class="hljs-keyword" style="font-weight: bold;">return</span> getValueFromSomewhere() }
    <span class="hljs-keyword" style="font-weight: bold;">set</span> { storeValueSomewhere(newValue) }
  }
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// user declares:</span>
  propertylist custom: dLabel d, s
  
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// compiler synthesizes:</span>
  <span class="hljs-keyword" style="font-weight: bold;">typealias</span> <span class="hljs-type">Custom</span> = (dLabel: <span class="hljs-type">Double</span>, s: <span class="hljs-type">String</span>)
  <span class="hljs-keyword" style="font-weight: bold;">var</span> custom: <span class="hljs-type">Custom</span> {
    <span class="hljs-keyword" style="font-weight: bold;">get</span> { <span class="hljs-keyword" style="font-weight: bold;">return</span> (dLabel: d, s: s) }
    <span class="hljs-keyword" style="font-weight: bold;">set</span> { (d, s) = newValue }
  }
  <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// <span class="hljs-doctag">NOTE:</span> no partial initializer because a computed property was included.</span>
}</code></pre><h4 id="usingthepropertylistattribute" 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;" class="">Using the&nbsp;<code style="line-height: 1;" class="">@propertylist</code>&nbsp;attribute</h4><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); 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>{
  @propertylist(custom) <span class="hljs-keyword" style="font-weight: bold;">var</span> s: <span class="hljs-type">String</span>, d: <span class="hljs-type">Double</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  <span class="hljs-keyword" style="font-weight: bold;">private</span> <span class="hljs-keyword" style="font-weight: bold;">let</span> i: <span class="hljs-type">Int</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;">typealias</span> <span class="hljs-type">Custom</span> = (s: <span class="hljs-type">String</span>, d: <span class="hljs-type">Double</span>)
  <span class="hljs-keyword" style="font-weight: bold;">var</span> custom: <span class="hljs-type">Custom</span> {
    <span class="hljs-keyword" style="font-weight: bold;">get</span> { <span class="hljs-keyword" style="font-weight: bold;">return</span> (s: s, d: d) }
    <span class="hljs-keyword" style="font-weight: bold;">set</span> { (s, d) = newValue }
  }
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> custom(s: <span class="hljs-type">String</span>, d: <span class="hljs-type">Double</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>) {
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.s = s
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.d = d
  }
}</code></pre><h4 id="usingapropertylistdeclarationformemberwiseintialization" 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;" class="">Using a property list declaration for memberwise intialization</h4><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 15px; background-color: rgb(248, 248, 248);" class=""><code class="swift hljs" style="line-height: inherit; display: block; padding: 0.5em; color: rgb(51, 51, 51); 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;">var</span> x, y, z: <span class="hljs-type">Int</span>
  <span class="hljs-keyword" style="font-weight: bold;">let</span> s: <span class="hljs-type">String</span>
  <span class="hljs-keyword" style="font-weight: bold;">let</span> d: <span class="hljs-type">Double</span>
  
  propertylist randomGroup aString s = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</span>, anInt x = <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;">// user declares</span>
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(...randomGroup) {
    y = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
    z = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</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>
  partial <span class="hljs-keyword" style="font-weight: bold;">init</span> randomGroup(aString s: <span class="hljs-type">String</span> = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</span>, anInt x: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>) {
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.s = s
    <span class="hljs-keyword" style="font-weight: bold;">self</span>.x = x
  }
  <span class="hljs-keyword" style="font-weight: bold;">init</span>(aString s: <span class="hljs-type">String</span> = <span class="hljs-string" style="color: rgb(221, 17, 68);">"hello"</span>, anInt x: <span class="hljs-type">Int</span> = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>) {
    randomGroup.<span class="hljs-keyword" style="font-weight: bold;">init</span>(aString: s, anInt: x)
    y = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
    z = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
    d = <span class="hljs-number" style="color: rgb(0, 153, 153);">42</span>
  }
  
}</code></pre><h4 id="usingthepropertylistattributeformemberwiseintialization" 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;" class="">Using the property list attribute for memberwise intialization</h4><p 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;" class="">```swift<br class="">struct S {<br class="">@propertylist(declaredTogether) var x, y, z: Int<br class="">let s: String<br class="">let d: Double</p><p 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;" class="">// user declares:<br class="">init(…declaredTogether) {<br class="">s = “hello”<br class="">d = 42<br class="">}</p><p 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;" class="">// compiler synthesizes:<br class="">partial init declaredTogether(x: Int, y: Int, z: Int) {<br class="">self.x = x<br class="">self.y = y<br class="">self.z = z<br class="">} init(x: Int, y: Int, z: Int) {<br class="">declaredTogether.init(x: Int, y: Int, z: Int)<br class="">s = “hello”<br class="">d = 42<br class="">}</p><p 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;" class="">}</p><h3 id="implicitpropertylists" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;" class="">Implicit property lists</h3><p 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;" class="">It may be desirable to have several implicit property lists available, such as one that includes all properties of the type. Properties would appear in any implicit property lists in declaration order.</p><p 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;" class="">The specific details of what implicit property lists should be available and what they should be called is a good topic for bikeshedding.</p><h2 id="detaileddesign" 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;" class="">Detailed design</h2><p 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;" class="">TODO but should fall out pretty clearly from the proposed solution</p><h2 id="impactonexistingcode" 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;" class="">Impact on existing code</h2><p 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;" class="">This is a strictly additive change. It has no impact on existing code.</p><h2 id="alternativesconsidered" 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;" class="">Alternatives considered</h2><p 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;" class="">We could live without this syntactic sugar. There are several reasons the language is better with it:</p><ol 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;" class=""><li style="font-size: 17px;" class="">It is much more convenient than manually writing memberwise partial intializers. It does not include any unnecessary information, thus making the details more clear.</li><li style="font-size: 17px;" class="">It gives us the memberwise computed tuple properties for free. This would would not be possible when writing memberwise partial initializers manually.</li><li style="font-size: 17px;" class="">It scales to any new memberwise features that might make sense for a type.</li></ol><p 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;" class="">As always, the&nbsp;<code style="line-height: 1;" class="">propertylist</code>&nbsp;keyword is game for bikeshedding. The use of&nbsp;<code style="line-height: 1;" class="">:</code>&nbsp;to separate the identifier from the list of properties could also be game for bikeshedding. Also, as mentioned previously, the implicit property lists are game for bikeshedding.</p></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=nns-2FBjd8vUIyZmnkfXvcBIDOLRP1cU9oMCgK1G0q49droKblbQr9S3sTlldXXrtwvqx1VR59mJSLxuUAuW8GZTKsEf-2Bp4aRAhPrFmuvx5iaGfq1yKzeCKCoRdYFD0w43wOI9GCVXKZzQDzD3qJsgeQWYbfs94ChG-2BIx5e-2Fy2BLr4NZ42DiCyRSKWwijHimwiQIMYHl6A0uEMBt01o-2BbxrA-3D-3D" alt="" width="1" height="1" border="0" style="height:1px !important;width:1px !important;border-width:0 !important;margin-top:0 !important;margin-bottom:0 !important;margin-right:0 !important;margin-left:0 !important;padding-top:0 !important;padding-bottom:0 !important;padding-right:0 !important;padding-left:0 !important;" class="">
</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><div class=""><div class=""><br class=""></div>

</div>
<br class=""></body></html>