<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="">I think the way it is now works just fine. The only use-case I could see for this would be for having multiple closures, but in that case I think defining them before the function call is clearer anyway.<br class=""><div class="">
<div style="color: rgb(0, 0, 0); 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; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class="">-thislooksfun (tlf)</div>
</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On Jan 4, 2017, at 10:40 PM, Derrick Ho 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="">So could we add a @trailing or @nontrailing to the block argument to toggle on and off the feature?<br class=""><br class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Wed, Jan 4, 2017 at 8:35 PM Douglas Gregor via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">On Jan 4, 2017, at 7:48 PM, Saagar Jha via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>> wrote:<br class="gmail_msg"><br class="gmail_msg"></div><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">Check out <a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160606/020470.html" class="gmail_msg" target="_blank">this thread</a>–it’s very similar to what you proposed, but it didn’t go anywhere. FWIW +1 to this as well as the ability to use multiple trailing closures like so:<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">animate(identifier: “”, duration: 0, update: {</div><div class="gmail_msg"><span class="gmail_msg m_3277681189286428966Apple-tab-span" style="white-space:pre-wrap">        </span>// update</div><div class="gmail_msg">}, completion: {</div><div class="gmail_msg"><span class="gmail_msg m_3277681189286428966Apple-tab-span" style="white-space:pre-wrap">        </span>// completion</div><div class="gmail_msg">}</div><div class="gmail_msg"><div class="gmail_msg">
<br class="gmail_msg m_3277681189286428966Apple-interchange-newline"><span style="font-family: 'SF UI Text'; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; float: none; display: inline !important;" class="gmail_msg">Saagar Jha</span><br style="font-family: 'SF UI Text'; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;" class="gmail_msg"><br style="font-family: 'SF UI Text'; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;" class="gmail_msg"><br style="font-family: 'SF UI Text'; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;" class="gmail_msg">
</div>
<br class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Jan 4, 2017, at 6:25 PM, Jay Abbott via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>> wrote:</div><br class="gmail_msg m_3277681189286428966Apple-interchange-newline"><div class="gmail_msg"><div dir="ltr" class="gmail_msg"><div class="gmail_msg m_3277681189286428966markdown-here-wrapper"><p style="margin:0px 0px 1.2em!important" class="gmail_msg">When you have a function with a closure and then another optional default <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="gmail_msg">= nil</code> closure at the end, like this:</p>
<pre style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px" class="gmail_msg"><code class="m_3277681189286428966language-swift m_3277681189286428966hljs gmail_msg" style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%">open <span class="gmail_msg m_3277681189286428966hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">static</span> <span class="m_3277681189286428966hljs-func gmail_msg"><span class="gmail_msg m_3277681189286428966hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="gmail_msg m_3277681189286428966hljs-title" style="color:rgb(153,0,0);font-weight:bold">animate</span><span class="m_3277681189286428966hljs-params gmail_msg">(identifier: String,
duration: Double,
update: @escaping AnimationUpdate,
completion: AnimationCompletion? = <span class="gmail_msg m_3277681189286428966hljs-built_in" style="color:rgb(0,134,179)">nil</span>)</span> </span>{
</code></pre><p style="margin:0px 0px 1.2em!important" class="gmail_msg">You can’t use trailing closure syntax for the <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="gmail_msg">update</code> argument when leaving the <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline" class="gmail_msg">completion</code> argument out/default.</p><p style="margin:0px 0px 1.2em!important" class="gmail_msg">This kind of breaks one of the benefits of default arguments, which is that you can add them to existing released functions without breaking the calling code. This means you have to add a separate convenience function without the extra argument, which is annoying and inelegant. </p></div></div></div></blockquote></div></div></div></blockquote></div><div dir="auto" class="gmail_msg"><div class="gmail_msg">Why not simply add the "completion" parameter before the trailing closure? That would still allow existing callers to work, without having to change the language. </div></div><div dir="auto" class="gmail_msg"><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg"><div class="gmail_msg m_3277681189286428966markdown-here-wrapper"><p style="margin:0px 0px 1.2em!important" class="gmail_msg">Another annoying thing is that you can easily miss this error if you happen to not use trailing closure syntax in your tests or other usage, because adding the extra default argument compiles fine for code that uses normal syntax.</p></div></div></div></blockquote></div></div></div></blockquote></div><div dir="auto" class="gmail_msg"><div class="gmail_msg">The Swift compiler warns when a parameter written as a closure type isn't the last parameter. The warning is actually disabled in the specific case above because you've written it using a typealias... maybe we should warn on such cases (it's worth a bug report). Regardless, in the majority of instances, you'll get a warning, so it won't be silent on disabling trailing closure syntax. </div></div><div dir="auto" class="gmail_msg"><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg"><div class="gmail_msg m_3277681189286428966markdown-here-wrapper"><p style="margin:0px 0px 1.2em!important" class="gmail_msg">Are there any issues/gotchas if the trailing closure syntax were to work for the last <em class="gmail_msg">specified</em> argument rather than the last <em class="gmail_msg">defined</em> argument?</p></div></div></div></blockquote></div></div></div></blockquote></div><div dir="auto" class="gmail_msg"><div class="gmail_msg">The main gotcha, and the reason the rule is the way it is, is that it means you'd lose trailing closure syntax if the caller wanted to specify an argument for the last parameter.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"> - Doug</div></div><div dir="auto" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg"><div class="gmail_msg m_3277681189286428966markdown-here-wrapper">
<div title="MDH:PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWlsX21zZyI+PGRpdiBjbGFzcz0iZ21haWxfbXNnIj48
ZGl2IGNsYXNzPSJnbWFpbF9tc2ciPjwvZGl2PldoZW4geW91IGhhdmUgYSBmdW5jdGlvbiB3aXRo
IGEgY2xvc3VyZSBhbmQgdGhlbiBhbm90aGVyIG9wdGlvbmFsIGRlZmF1bHQgYD0gbmlsYCBjbG9z
dXJlIGF0IHRoZSBlbmQsIGxpa2UgdGhpczo8YnIgY2xhc3M9ImdtYWlsX21zZyI+PC9kaXY+YGBg
c3dpZnQ8YnIgY2xhc3M9ImdtYWlsX21zZyI+b3BlbiBzdGF0aWMgZnVuYyBhbmltYXRlKGlkZW50
aWZpZXI6IFN0cmluZyw8YnIgY2xhc3M9ImdtYWlsX21zZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7IGR1cmF0aW9uOiBEb3VibGUsPGJyIGNsYXNzPSJnbWFpbF9tc2ciPiZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1cGRhdGU6IEBlc2NhcGluZyBBbmltYXRpb25VcGRhdGUs
PGJyIGNsYXNzPSJnbWFpbF9tc2ciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb21w
bGV0aW9uOiBBbmltYXRpb25Db21wbGV0aW9uPyA9IG5pbCkgezxiciBjbGFzcz0iZ21haWxfbXNn
Ij5gYGA8YnIgY2xhc3M9ImdtYWlsX21zZyI+PGRpdiBjbGFzcz0iZ21haWxfbXNnIj5Zb3UgY2Fu
J3QgdXNlIHRyYWlsaW5nIGNsb3N1cmUgc3ludGF4IGZvciB0aGUgYHVwZGF0ZWAgYXJndW1lbnQg
d2hlbiBsZWF2aW5nIHRoZSBgY29tcGxldGlvbmAgYXJndW1lbnQgb3V0L2RlZmF1bHQuPGJyIGNs
YXNzPSJnbWFpbF9tc2ciPjxiciBjbGFzcz0iZ21haWxfbXNnIj48L2Rpdj48ZGl2IGNsYXNzPSJn
bWFpbF9tc2ciPlRoaXMga2luZCBvZiBicmVha3Mgb25lIG9mIHRoZSBiZW5lZml0cyBvZiBkZWZh
dWx0IGFyZ3VtZW50cywgd2hpY2ggaXMgdGhhdCB5b3UgY2FuIGFkZCB0aGVtIHRvIGV4aXN0aW5n
IHJlbGVhc2VkIGZ1bmN0aW9ucyB3aXRob3V0IGJyZWFraW5nIHRoZSBjYWxsaW5nIGNvZGUuIFRo
aXMgbWVhbnMgeW91IGhhdmUgdG8gYWRkIGEgc2VwYXJhdGUgY29udmVuaWVuY2UgZnVuY3Rpb24g
d2l0aG91dCB0aGUgZXh0cmEgYXJndW1lbnQsIHdoaWNoIGlzIGFubm95aW5nIGFuZCBpbmVsZWdh
bnQuIEFub3RoZXIgYW5ub3lpbmcgdGhpbmcgaXMgdGhhdCB5b3UgY2FuIGVhc2lseSBtaXNzIHRo
aXMgZXJyb3IgaWYgeW91IGhhcHBlbiB0byBub3QgdXNlIHRyYWlsaW5nIGNsb3N1cmUgc3ludGF4
IGluIHlvdXIgdGVzdHMgb3Igb3RoZXIgdXNhZ2UsIGJlY2F1c2UgYWRkaW5nIHRoZSBleHRyYSBk
ZWZhdWx0IGFyZ3VtZW50IGNvbXBpbGVzIGZpbmUgZm9yIGNvZGUgdGhhdCB1c2VzIG5vcm1hbCBz
eW50YXguPGJyIGNsYXNzPSJnbWFpbF9tc2ciPjxiciBjbGFzcz0iZ21haWxfbXNnIj48L2Rpdj48
ZGl2IGNsYXNzPSJnbWFpbF9tc2ciPkFyZSB0aGVyZSBhbnkgaXNzdWVzL2dvdGNoYXMgaWYgdGhl
IHRyYWlsaW5nIGNsb3N1cmUgc3ludGF4IHdlcmUgdG8gd29yayBmb3IgdGhlIGxhc3QgKnNwZWNp
ZmllZCogYXJndW1lbnQgcmF0aGVyIHRoYW4gdGhlIGxhc3QgKmRlZmluZWQqIGFyZ3VtZW50Pzxi
ciBjbGFzcz0iZ21haWxfbXNnIj48L2Rpdj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0" class="gmail_msg"></div></div></div>
_______________________________________________<br class="gmail_msg">swift-evolution mailing list<br class="gmail_msg"><a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg"></div></blockquote></div><br class="gmail_msg"></div></div></blockquote><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><span class="gmail_msg">_______________________________________________</span><br class="gmail_msg"><span class="gmail_msg">swift-evolution mailing list</span><br class="gmail_msg"><span class="gmail_msg"><a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a></span><br class="gmail_msg"><span class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class="gmail_msg"></div></blockquote></div>_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></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>