<div dir="ltr">+1. I&#39;ve had a hard time cleaning up certain pieces of code that involve multiple optional chains and condition checks.<div><div><br></div><div>One solution I came up with, but have never used in practice (because it&#39;s too obscure), is this:</div><div><br></div><div><div>    extension Equatable {</div><div>        func <b>except</b>(excludedValue: Self) -&gt; Self? {</div><div>            return self == excludedValue ? nil : self</div><div>        }</div><div>    }</div></div><div><br></div><div>Then you can make a non-optional Equatable value into an Optional by checking against a known excluded value:</div><div><br></div><div><div>    if let input = inputs.first, ...,</div><div>        let matchLoc = regex.rangeOfFirstMatchInString(...).location.<b>except</b>(NSNotFound)</div><div>    {</div><div>        // Do something with matchLoc</div><div>    } else ...</div></div><div><br></div><div><br></div><div>Another, more flexible, option is to make a new protocol with an extension that provides similar functionality, but with a closure argument. Then you unfortunately have to add a trivial conformance for any type you need to use.</div><div><br></div><div><div><div>    protocol Satisfying {}</div><div>    extension Satisfying {</div><div>        func <b>satisfying</b>(@noescape predicate: Self -&gt; Bool) -&gt; Self? {</div><div>            return predicate(self) ? self : nil</div><div>        }</div><div>    }</div><div><br></div><div>    extension NSRange: Satisfying {}</div></div></div><div><br></div><div><div>    if let input = inputs.first, ...,</div><div>        let matchRange = regex.rangeOfFirstMatchInString(...).<b>satisfying</b>({ $0.location != NSNotFound })</div><div>    {</div><div>        // Do something with matchRange</div><div>    } else ...</div></div><div><br></div><div><br></div><div>To be clear, here&#39;s what the user <b>wants</b> to do; the clearest code:</div><div><br></div><div><div>    if let input = inputs.first, ...,</div><div>        let matchRange = regex.rangeOfFirstMatchInString(...)</div><div>        <b>where</b> matchRange.location != NSNotFound</div><div>    {</div><div>        // Do something with matchRange</div><div>    } else ...</div></div><div><br></div><div>But that&#39;s not allowed, because rangeOfFirstMatchInString returns a non-optional NSRange.</div><div><br></div><div>(Arguably this is a bug to be fixed in the regex API, which should be replacing NSRange with Range&lt;Int&gt;?, but it&#39;s a good example of something that crops up in plenty of other places.)</div><div class="gmail_extra"><br clear="all"><div><div><div dir="ltr"><div>Jacob<br></div></div></div></div>
<br><div class="gmail_quote">On Wed, Jan 6, 2016 at 11:06 PM, Krzysztof Siejkowski 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">FWIW, not sure if it fits your desired outcome, but some time ago I’ve proposed the idea of `CustomOptionalConvertible` protocol:</div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/000918.html" target="_blank">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/000918.html</a> </div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><br></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">This could be used to extend the let binding syntax to any arbitrary type, as long as the user provides the valid translation to Optional&lt;Type&gt;.</div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><br></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">The proposal, unfortunately, did not get a lot of attention at the time.</div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><br></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">The main drawback to such a solution for your case is that CustomOptionalConvertible is an opt-in mechanism, so you’d need to write the implementation of CustomOptionalConvertible to each type you wish to let bind:</div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><br></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">extension Type : CustomOptionalConvertible {</div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><span style="white-space:pre-wrap">        </span>typealias Wrapped = Type</div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><span style="white-space:pre-wrap">        </span>public var <span style="white-space:pre-wrap">optional: Optional&lt;Type&gt; { get {</span></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><span style="white-space:pre-wrap"><span style="white-space:pre-wrap">                </span>return .Some(self)</span></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><span style="white-space:pre-wrap"><span style="white-space:pre-wrap">        </span>}}</span></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">}</div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px"><br></div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">Would the necessity for the above boilerplate be a show-stopper to you? </div><div style="font-family:Helvetica,Arial;font-size:13px;color:rgb(0,0,0);margin:0px">If so, would you rather see the extension of let bind syntax as default on for all the types?</div> <div><br></div>Cheers,<div>Krzysztof<div><div><br> <div></div> <br><p>On 7 January 2016 at 07:41:06, Russ Bishop via swift-evolution (<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>) wrote:</p> <blockquote type="cite"><span><div><div></div><div>I often want to bind variables to a specific scope, or perhaps I have three optionals I want to bind and one non-optional. (Often I need that non-optional value as part of a where condition check but not being able to bind it means I leak the variable to the outer scope).<br><br>Not being able to bind non-optionals breaks the flow of the code and forces me to make a minor context switch when it really doesn’t matter, nor does it aid code clarity.  <br><br><br>Does anyone have strong thoughts about this? I tried searching the evolution repo and the mailing list and didn’t see anything.<br><br><br>—russ<br>_______________________________________________<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><br></div></div></span></blockquote></div></div></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=P-2BsYbBZHRBuLDBJaL4DIKDNfkkjpROowTyRAObV11qxl-2B-2BH6Ywr8RPY3gFEEKZCTFb5-2FK17jyQHv5-2FLnc2Y9kXKzDKGegn5lgYjWRk57LbpBEJ2aVHQ3yuzvwN1eHYiAWBgE2KDtzi51-2FRn54L9vLswP0cX9joBl3XNAfzDuKqtJDslJWwyfOLwKFawg1lW-2BKsKXrhrmv-2FCDw3xA6diXlhSaCKWemN8Ef0ER7XbWYts-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>_______________________________________________<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" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div></div></div>