<div dir="ltr">How about `for? object in array` instead?<div class="gmail_extra">
<br><div class="gmail_quote">On Fri, Dec 18, 2015 at 1:13 PM, Paul Cantrell via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><blockquote type="cite"><div style="font-family:HelveticaNeue">`<span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap">for object in? array` … suggests that there’s something optional about checking for inclusion, not about the array itself. It could easily be interpreted as “iterate for all non-nil elements of array (where array: [T?])” — a use case arguably more common than this.</span></span></div></blockquote></div><div><div style="font-family:HelveticaNeue"><span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap"><br></span></span></div></div><div style="font-family:HelveticaNeue"><span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap">That’s a really good point.</span></span></div><div style="font-family:HelveticaNeue"><span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap"><br></span></span></div><div style="font-family:HelveticaNeue"><span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap">P</span></span></div><div><div class="h5"><div><br></div><br><div><blockquote type="cite"><div>On Dec 18, 2015, at 3:06 PM, Radosław Pietruszewski &lt;<a href="mailto:radexpl@gmail.com" target="_blank">radexpl@gmail.com</a>&gt; wrote:</div><br><div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Personally, I’m -1 for the proposal. I see this as a solution to a very minor, fairly rare, and not generalizable problem.</div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Perhaps more importantly: the syntax is confusing to my eyes. `<span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap">for object in? array` doesn’t immediately convey its semantics to me. It suggests that there’s something optional about checking for inclusion, not about the array itself. It could easily be interpreted as “iterate for all non-nil elements of array (where array: [T?])” — a use case arguably more common than this.</span></span></div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap"><br></span></span></div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap">In the vast majority of cases, arrays shouldn’t be optional in the first place. It’s rare that there’s a semantic difference between “empty array” and “no array”.</span></span></div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="background-color:rgb(255,255,255)"><span style="white-space:pre-wrap"><br></span></span></div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div style="word-wrap:break-word"><div>Sure, in that example it’s quite simple. It’s not the “?? []” syntax itself, which is perfectly clear; it’s having that dangling off the end of some longer expression. In real-world context, it does become additional noise.</div></div></blockquote><br></div><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">That is a good point, albeit one that’s more broad than that — I dislike how `as?` often forces me to add additional parentheses — and not strong enough to warrant an introduction of a new `in?` construct IMHO.</div><br style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div>— Radek</div></div><br style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div style="font-family:HelveticaNeue;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div>On 18 Dec 2015, at 21:56, Paul Cantrell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><br><blockquote type="cite">On Dec 17, 2015, at 4:08 AM, Jeremy Pereira &lt;<a href="mailto:jeremy.j.pereira@googlemail.com" target="_blank">jeremy.j.pereira@googlemail.com</a>&gt; wrote:<br><br><br><blockquote type="cite">On 16 Dec 2015, at 19:52, Paul Cantrell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br>I do this a lot:<br><br>   for object in array ?? [] {<br><br>…and it does impair readability a bit at times.<br></blockquote><br>Does it? It seems fairly understandable to me even though I have never seen it before.<br></blockquote><div><br></div><div>Sure, in that example it’s quite simple. It’s not the “?? []” syntax itself, which is perfectly clear; it’s having that dangling off the end of some longer expression. In real-world context, it does become additional noise.</div><div><br></div><blockquote type="cite">I think there is a good reason for keeping this construct a bit “clunky”. Generally APIs give you a nil array for one of two reasons:<br><br>- there was some sort of error in retrieving the elements<br>- there were no qualifying elements found.<br></blockquote><div><br></div><div>You’re forgetting the third case, the most common one: things not populated / initialized yet. In that case, we often just want to leave a UI blank, for example, and doing nothing is the right behavior.</div><div><br></div><div>Doing nothing is the right behavior in a<span> </span><i>lot</i> of cases, and since Swift provides optional sugar for “do nothing if nil” in other cases:</div><div><br></div><div><div style="margin:0px;font-size:10.5px;line-height:normal;font-family:Menlo"><span style="font-size:10.5px">   <span> </span><font color="#323e7d">foo?.bar = baz</font></span></div></div><div><div><div style="margin:0px;font-size:10.5px;line-height:normal;font-family:Menlo"><span style="font-size:10.5px">    <font color="#323e7d">if let foo = bar { }</font></span></div></div></div><div><span style="font-size:10.5px"><font color="#323e7d"><br></font></span></div><div>…it makes sense to provide it in for loops too.</div><div><br></div><div>True, “do nothing” is not the right behavior in all cases. Thus the `for…in` / `for … in?` distinction.</div><div><br></div><blockquote type="cite">In the second case, the API is wrong.</blockquote><br><div>Then a lot of APIs are wrong! NSURLComponents, for example:</div><div><br></div><div><div style="margin:0px;font-size:10.5px;line-height:normal;font-family:Menlo"><span style="font-size:10.5px">        </span><span style="font-size:10.5px;color:rgb(50,62,125)">for</span><span style="font-size:10.5px"><span> </span>item<span> </span></span><span style="font-size:10.5px;color:rgb(50,62,125)">in</span><span style="font-size:10.5px"> urlComponents.</span><span style="font-size:10.5px;color:rgb(88,126,168)">queryItems</span><span style="font-size:10.5px"> ?? []</span></div><div style="margin:0px;font-size:10.5px;line-height:normal;font-family:Menlo">            { queryDict[item.<span style="color:rgb(88,126,168)">name</span>] = item.<span style="color:rgb(88,126,168)">value</span><span> </span>}</div></div><div><br></div><div>But then I don’t think NSURLComponents is making a mistake: it distinguishes “no query string” from “empty query string”, but for the purposes of the loop here, there upshot in both cases is “no query items.”</div><div><br></div><div>True, ?? [] is minor noise — but given the clarity and low impact on existing code of a `for … in?` counterpart to `for … in`, it’s worth at least considering that option.</div><div><br></div><div>Cheers,</div><div><br></div><div>Paul</div><div><br></div><div><br></div><div><br></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=4hhvaxvZNsLrnZM9llg93kxoqfFYC8lhv8HAehOIDqKQXtEz44wzr57ueVaQ0SQlINAEWx-2FlQ6heG1BfClLuVCgQj6mVussRh0Fn12l9TvpgflEDodqORozjg-2BCZAnc76mhJLZ09jUOlHA6bL6DTPSKcp3oj78Exc-2Bj9UnzYb2mTXCGZyGarqO57AZOEfF49Q8wEqK1MqLFTqbYTqUPv5Fs1SbdgGmIgpMuyMXoEctE-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0px!important;margin:0px!important;padding:0px!important"></div>_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div></div></blockquote></div><br>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=P-2BsYbBZHRBuLDBJaL4DIKDNfkkjpROowTyRAObV11qxr9GnJAiAwRYYfnZxtBrPCWd20WCXroFGcTo1EGQNkIQ-2FKeabTqBOYzLd4mWkdf8Bd2V755WfnM0UnVnqegqgoP-2FlpJDwTWg3zTQMHYvw82YIRsKQKF8SMu5xDfqiuYpqGoMdAmcoqx3UtTrnlPqW8w5bz4cujMtSKuGHJVvQloSMWP-2BDG5oB4uIOzF-2FnzaFo-3D" alt="" width="1" height="1" border="0" style="min-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">
</div></div></div>
<br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div></div>