<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="">Surely <font face="Monaco" class="">inout</font> isn’t a modifier of the type either, but rather a modifier of the parameter as a whole, not the label specifically. Couldn’t we just allow the label to be omitted for closures such as in your <font face="Monaco" class="">(inout T) -> U</font> example?</div><div class=""><br class=""></div><div class="">I don’t suppose it really matters if we’re considering getting rid of var on parameters (so they’re all immutable by default if not inout), so it could go anywhere, I just think that it’s a bit strange to associate with the type specifically when it’s not really specific to that either IMO.</div><br class=""><div><blockquote type="cite" class=""><div class="">On 29 Jan 2016, at 19:40, Dave via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> 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="">+1<br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 29, 2016, at 11:37, Erica Sadun via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> 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=""><a href="https://github.com/apple/swift-evolution/pull/127" class="">https://github.com/apple/swift-evolution/pull/127</a><div class=""><br class=""></div><div class=""><h1 id="adjustinginoutdeclarationsfortypedecoration" style="margin: 0px 0px 0.875em; font-size: 1.5em; line-height: 0.875em; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;" class="">Adjusting <code class="">inout</code> Declarations for Type Decoration</h1><ul style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; font-size: 16px;" class=""><li style="font-size: 18px;" class="">Proposal: TBD</li><li style="font-size: 18px;" class="">Author(s): <a href="https://github.com/jckarter" 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="">Joe Groff</a>, <a href="http://github.com/erica" 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="">Erica Sadun</a></li><li style="font-size: 18px;" class="">Status: TBD</li><li style="font-size: 18px;" class="">Review manager: TBD</li></ul><h2 id="introduction" style="color: rgb(17, 17, 17); margin: 0px 0px 0.9545454545454546em; font-size: 1.375em; line-height: 0.9545454545454546em; 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; font-size: 1.1429em; line-height: 1.3125em; margin: 1.3125em 0px;" class="">The <code class="">inout</code> keyword indicates copy-in/copy-out argument behavior. In its current implementation<br class="">the keyword prepands argument names. We propose to move the <code class="">inout</code> keyword to the right<br class="">side of the colon to decorate the type instead of the parameter label. </p><p style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; font-size: 1.1429em; line-height: 1.3125em; margin: 1.3125em 0px;" class=""><em class="">The initial Swift-Evolution discussion of this topic took place in the “Replace ‘inout’ with &” thread.</em></p><h2 id="motivation" style="color: rgb(17, 17, 17); margin: 0px 0px 0.9545454545454546em; font-size: 1.375em; line-height: 0.9545454545454546em; 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; font-size: 1.1429em; line-height: 1.3125em; margin: 1.3125em 0px;" class="">In Swift 2, the <code class="">inout</code> parameter lives on the label side rather than the type side of the colon<br class="">although the keyword isn’t modifying the label but its type. Decorating<br class="">types instead of labels offers identifiable advantages: </p><ul style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; font-size: 16px;" class=""><li style="font-size: 18px;" class=""><div style="word-wrap: break-word; line-height: 1.3125em; margin: 0px;" class="">It enables the <code class="">inout</code> keyword to properly integrate into full type syntax, for example: </div><pre class=""><code class="swift coffeescript hljs" style="display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); background-position: initial initial; background-repeat: initial initial;"><span class="hljs-function"><span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(x: inout T)</span> -></span> U <span class="hljs-regexp" style="color: rgb(0, 153, 38);">//</span><span class="hljs-function"> =></span> <span class="hljs-function"><span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(inout T)</span> -></span> U</code></pre></li><li style="font-size: 18px;" class=""><div style="word-wrap: break-word; line-height: 1.3125em; margin: 0px;" class="">It avoids notational similarity with arguments labeled <code class="">inout</code>, for example:</div><pre class=""><code class="swift coffeescript hljs" style="display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); background-position: initial initial; background-repeat: initial initial;">func foo<span class="hljs-function"><span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(inOut x: T)</span> // <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">foo</span><span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(inOut:)</span>, <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">type</span> <span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(T)</span> -></span> Void
func foo<span class="hljs-function"><span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(inout x: T)</span> // <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">foo</span><span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(_:)</span>, <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">type</span> <span class="hljs-params" style="color: rgb(153, 0, 0); font-weight: bold;">(inout T)</span> -></span> Void</code></pre></li><li style="font-size: 18px;" class=""><div style="word-wrap: break-word; line-height: 1.3125em; margin: 0px;" class="">It better matches similar patterns in other languages such as borrowing in Rust, that may be later introduced back to Swift </div></li></ul><h2 id="detaileddesign" style="color: rgb(17, 17, 17); margin: 0px 0px 0.9545454545454546em; font-size: 1.375em; line-height: 0.9545454545454546em; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;" class="">Detailed design</h2><pre style="color: rgb(17, 17, 17); font-size: 16px;" class=""><code class=" lasso hljs" style="display: block; padding: 0.5em; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); background-position: initial initial; background-repeat: initial initial;">parameter → external<span class="hljs-attribute" style="color: rgb(0, 128, 128);">-parameter</span><span class="hljs-attribute" style="color: rgb(0, 128, 128);">-name</span> optlocal<span class="hljs-attribute" style="color: rgb(0, 128, 128);">-parameter</span><span class="hljs-attribute" style="color: rgb(0, 128, 128);">-name</span> : <span class="hljs-keyword" style="font-weight: bold;">type</span><span class="hljs-attribute" style="color: rgb(0, 128, 128);">-annotation</span>
<span class="hljs-keyword" style="font-weight: bold;">type</span><span class="hljs-attribute" style="color: rgb(0, 128, 128);">-annotation</span> → inout <span class="hljs-keyword" style="font-weight: bold;">type</span><span class="hljs-attribute" style="color: rgb(0, 128, 128);">-annotation</span></code></pre><h2 id="alternativesconsidered" style="color: rgb(17, 17, 17); margin: 0px 0px 0.9545454545454546em; font-size: 1.375em; line-height: 0.9545454545454546em; 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; font-size: 1.1429em; line-height: 1.3125em; margin: 1.3125em 0px;" class="">Decorations using <code class="">@inout</code> (either <code class="">@inout(T)</code> or <code class="">@inout T</code>) were considered and discarded</p></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br 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><br class=""></body></html>