<div dir="ltr"><div>So...</div><div><br></div><div>Our basic &#39;switch&#39; takes an expression and tries to match it to the first matching case (with programmer option to &#39;fallthrough&#39;. The compiler runs an extra routine to check we covered every situation, but as far as I know, it&#39;s only sure in cases of booleans and enums. In all other situations the compiler requires a &#39;default&#39; case.</div><div><br></div><div>The proposed &#39;switch!&#39; says: the programmer overrules the compiler. Don&#39;t require a default case, the provided cases cover everything, yes we&#39;re sure, crash if not. It&#39;s &#39;default: fatalError()&#39; in one character.</div><div><br></div><div>I&#39;m not sure what &#39;switch?&#39; ought to do. If I understand you right, you&#39;re suggesting that &#39;switch?&#39; be &#39;default: break&#39; in one character. I think that might have merit, but I also think the compiler would still have to do its checks, because in this case:</div><div>&#39;let x : Foo</div><div>switch? y</div><div>{</div><div>   case z: x = Foo()</div><div>   case ...: ...</div><div>   ...</div><div>}&#39;</div><div>If the compiler doesn&#39;t think it can find a matching case for y, then Swift can&#39;t be sure that x has a value. That should still have a warning.</div><div><br></div><div>If I haven&#39;t understood you, please clarify.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 12, 2016 at 7:06 PM, Алексей Демедецкий <span dir="ltr">&lt;<a href="mailto:demedeckie@gmail.com" target="_blank">demedeckie@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">+1 for this switch behavior. Can we also treat switch? as one with did not require default checking?<br>
<span class=""><br>
&gt; I have a suggestion.<br>
&gt; Suppose we think of &#39;switch&#39; as being like a non-optional type. The compiler does its thing and tries to ensure that the switched expression will match something, and enforces a default if it cannot verify a matching state.<br>
&gt; Could we force the switch? i.e. suffix the &#39;switch&#39; keyword with an exclamation mark, to say: the programmer insists that one of these cases will match; there&#39;s no need for a default case, but if nothing matches then crash.<br>
&gt;<br>
&gt; For example:<br>
&gt; let x:Int<br>
&gt; switch! expression<br>
&gt; {<br>
&gt; case ... { x = 1 }<br>
&gt; case ... { x = 2 }<br>
&gt; // no default. the ! signifies that the app should crash if none of these cases matches the expression<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
</span>&gt; On Fri, Feb 12, 2016 at 5:32 PM, Chris Lattner via swift-evolution&lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>(mailto:<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>)&gt;wrote:<br>
<span class="">&gt; &gt; On Feb 12, 2016, at 9:27 AM, Amir Michail&lt;<a href="mailto:a.michail@me.com">a.michail@me.com</a>(mailto:<a href="mailto:a.michail@me.com">a.michail@me.com</a>)&gt;wrote:<br>
&gt; &gt; &gt;&gt;&gt;<br>
&gt; &gt; &gt;&gt;&gt;What’s wrong with having the compiler explicitly check for “false”?<br>
&gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt;&gt;Weird special cases make the compiler less predictable.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;True, but not having them requires deeper knowledge of the standard libraries.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;In practice, just checking for “false” would solve this problem.<br>
&gt; &gt;<br>
</span>&gt; &gt; That is not what you’re actually proposing.You are proposing that the compiler encode special knowledge of the precondition *library function* into the compiler, and teach it about a single special case.We don’t like the compiler to have special cases like this for a large number of reasons, in particular, if we did this, someone would file a bug asking for *their* equivalent reimplementation of precondition to have the same magic blessed behavior.<br>
&gt; &gt;<br>
&gt; &gt; This is a slippery slope that leads to a lot of complexity downstream, it is better to keep the compiler simple and predictable.Also, as other people have pointed out, this has already been solved for you: just use preconditionFailure.<br>
<span class="">&gt; &gt;<br>
&gt; &gt; -Chris<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; swift-evolution mailing list<br>
</span>&gt; &gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>(mailto:<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>)<br>
&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
&gt;<br>
&gt; </blockquote></div><br></div>