<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="">I’ve always had a funny feeling about the `where` keyword in `if` statements. It feels like it adds structure, but it’s not the most flexible of keywords. I sometimes find myself writing to match the structure it wants rather than the other way around. I rather like this proposal.</div><div class=""><br class=""></div><div class="">What if `where` could be used to constrain the unwrapping of the optional rather than being an independent boolean expression? You could possibly use it normally outside of `if` like so:</div><div class=""><br class=""></div><div class="">let a: Optional&lt;String&gt; = "hello"</div><div class=""><br class=""></div><div class="">…</div><div class=""><br class=""></div><div class="">let b = a where a?.count &gt; 4 &nbsp;// .some(“hello”)</div><div class="">let c = a where a?.count &gt; 10 &nbsp;// .none</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">That way when used in an `if` statement, the `where` is actually part of the optional unwrap rather than a separate sibling.</div><div class=""><br class=""></div><div class="">if let x = x where x &lt; 3 {</div><div class="">&nbsp; …</div><div class="">}</div><div class=""><br class=""></div><div class="">So people keep their ability to group related things together, with the simple elegance of this proposal. Just an idea, and I’m sure it can be improved.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Another idea is a .filter() method added to Optional.</div><div class=""><br class=""></div><div class="">if let x = x.filter({ $0 &lt; 3 }) {</div><div class="">&nbsp; …</div><div class="">}</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Patrick</div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On 1 Jun 2016, at 8:38 PM, Haravikk 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=""><div class=""><div dir="ltr" class=""><div class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On 1 Jun 2016, at 02:47, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">Q: How is an arbitrary boolean assertion introduced after `if let`?</div><div class=""><br class=""></div><div class="">Option 1 (present scenario)--using `where`</div><div class="">Advantages: expressive when it means exactly the right thing</div><div class="">Drawbacks: makes obligatory the suggestion of a semantic relationship between what comes before and after even when there is no such relationship</div></div></div></blockquote><div class=""><br class=""></div><div class="">Like I said a little earlier, this drawback is not strictly true. No matter how unrelated to the binding a where clause may seemingly be, the binding is still dependent upon it; i.e- no value is bound if the condition fails, so regardless of what the condition is actually testing for it is very much related to the binding, like-so:</div><div class=""><br class=""></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>if let value = foo where somethingUnrelatedIsTrue() { … }</font></div><div class=""><br class=""></div><div class="">The variable named “value” doesn’t exist outside of this condition if somethingUnrelatedIsTrue() fails, so I’d say there is still very much a relationship between these two things. A lot of the time you probably&nbsp;<b class="">do</b>&nbsp;want to test the unwrapped value, but it’s not a requirement for the condition to be related, because one cannot succeed without the other.</div><div class=""><br class=""></div><blockquote type="cite" class=""><div dir="ltr" class=""><div class="">Option 3--using a symbol never encountered in conditional statements (e.g. semicolon)</div><div class="">Advantages: doesn't need to be disambiguated from any existing uses</div><div class="">Drawbacks: looks out of place</div></div></blockquote><br class=""></div><div class="">How out of place does it really look? It’s no different from semi-colons for separating statements in code, and if where remains supported you’ll only need to use it in a handful of cases anyway (much like semi-colons for statement separation).</div></div></div></div><div class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="">It does occur to me that there is one more option. I don't know that I like it, but it's an option no one has put forward before: recite the opening keyword when beginning a new boolean expression:</div><div class=""><br class=""></div><div class="">`if let x = x where x &lt; 3 { ... }` becomes</div><div class="">`if let x = x if x &lt; 3 { ... }`</div><div class=""><br class=""></div><div class="">`while let item = sequence.next() where item &gt; 0 { ... }` becomes</div><div class="">`while let item = sequence.next() while item &gt; 0 { ... }`</div></div></div></blockquote><br class=""></div><div class="">I’m not sure what the difference is here; it doesn’t seem to have any capability that where doesn’t, surely it’s just changing the name of the keyword or is the point to have the full range of capabilities on both sides of the keyword? This could be done with where just as easily, no need for renaming, like so:</div><div class=""><br class=""></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>if let value = foo where case .Some(let value2) = bar { … }</font></div><div class=""><br class=""></div><div class="">Bad example I know, but I don’t use pattern matching much. This currently doesn’t compile, but where could be extended to include all conditional types, so you could chain it to do pattern matching, conditional binding and a conditional all in one, is that the kind of thing you mean?</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="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>