<div dir="ltr">I would like to add a syntax sugar .casesBelow for enum value to be used in switch sentence to avoid default case.<div><br></div><div>enum MyEnum {</div><div>    case a</div><div>    case b</div><div>    case c</div><div>}</div><div><br></div><div>let myEnum: MyEnum  = .a</div><div><br></div><div>//Normally we need default case</div><div>switch myEnum {</div><div>    case .a: print(&quot;a&quot;)</div><div>    default: print(&quot;other value&quot;)</div><div>}</div><div><br></div><div>//Now use syntax sugar</div><div><div>switch myEnum.casesBelow {</div><div>    case .a: print(&quot;a&quot;)</div><div>}<br></div></div><div><br><div><br></div><div>This would look more intuitive to me than other solutions but I am not sure how much effort we need for this.<div><br></div><div><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Jan 15, 2018 at 4:36 AM Vladimir.S via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
On 12.01.2018 21:38, Jordan Rose wrote:<br>
&gt;<br>
&gt;<br>
&gt;&gt; On Jan 12, 2018, at 06:49, Michel Fortin via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; &lt;mailto:<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt; Le 12 janv. 2018 à 4:44, Vladimir.S via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt;&gt; &lt;mailto:<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;&gt; a écrit :<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On 12.01.2018 10:30, Chris Lattner via swift-evolution wrote:<br>
&gt;&gt;&gt;&gt;&gt; On Jan 11, 2018, at 11:15 PM, Jean-Daniel via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt;&gt;&gt;&gt; &lt;mailto:<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; A question about the new #unknown behavior. Is it intended to be used for error handling too ?<br>
&gt;&gt;&gt;&gt;&gt; Will it be possible to use in catch clause ?<br>
&gt;&gt;&gt;&gt; If we go with the #unknown approach, then yes of course it will work in catch clauses.  They are patterns, so it<br>
&gt;&gt;&gt;&gt; naturally falls out.<br>
&gt;&gt;&gt;&gt; If we go with the “unknown default:” / “unknown case:&quot;  approach, then no, this has nothing to do with error handling.<br>
&gt;&gt;&gt;&gt; IMO, this pivots on the desired semantics for “unknown cases in enums”: if you intentionally try to match on this,<br>
&gt;&gt;&gt;&gt; do we get a warning or error if you don’t handle all the cases?  If we can get to consensus on that point, then the<br>
&gt;&gt;&gt;&gt; design is pretty obvious IMO.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; For me the other question is what &quot;all the cases&quot; means for enum with private cases(if we&#39;ll have them). I.e. if<br>
&gt;&gt;&gt; switch contains all the &quot;public&quot; cases of frozen enum - does this mean &quot;all the cases&quot; were processed? As I<br>
&gt;&gt;&gt; understand, the answer is no, because we *can* have &#39;private&#39; case value here and so we need to react to this. How<br>
&gt;&gt;&gt; switch will look in this case?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; switch frozenEnumWithPrivateCases {<br>
&gt;&gt;&gt;  case .one: ..<br>
&gt;&gt;&gt;  case .two: ..<br>
&gt;&gt;&gt;  unknown default: ..  // or &#39;case #unknown:&#39; depending on our decision, or &#39;unknown case:&#39; etc<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt; ?<br>
&gt;&gt;&gt; But then such switch looks exactly as switch for non-frozen enum value, no? It looks like we are reacting on future<br>
&gt;&gt;&gt; new cases, while enum is frozen.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Moreover. How the switch for non-frozed enum with private cases should looks like?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; switch nonfrozenEnumWithPrivateCases {<br>
&gt;&gt;&gt;  case .one: ..<br>
&gt;&gt;&gt;  case .two: ..<br>
&gt;&gt;&gt;  unknown default: ..  // or &#39;case #unknown:&#39; depending on our decision, or &#39;unknown case:&#39; etc<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt; ? But then, is that &#39;unknown default&#39; for reacting on &quot;future&quot; cases we didn&#39;t know about during the compilation OR<br>
&gt;&gt;&gt; it is for reacting on private cases?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Or the main idea that we don&#39;t want to separate &quot;future&quot; cases and &quot;private&quot; cases?<br>
&gt;&gt;<br>
&gt;&gt; I think treating both as the same thing is the right idea. You also need to handle &quot;future private&quot; cases and &quot;private<br>
&gt;&gt; cases that become public in the future&quot;. These are all unknown cases in the context of the switch.<br>
&gt;&gt;<br>
&gt;&gt; So an enum with private cases can&#39;t be switched exhaustively outside of its module. Thus, @frozen would need to forbid<br>
&gt;&gt; private cases... or we need @exhaustive to forbid private cases so they can be allowed by @frozen.<br>
&gt;<br>
&gt; As mentioned in &quot;Future directions&quot;, my recommendation to anyone planning to write a proposal for non-public cases is to<br>
&gt; go with the former, which would keep it from infecting the design.<br>
&gt;<br>
<br>
Thank you for the comment!<br>
 From proposal:<br>
&quot;Were such a proposal to be written, I advise that a frozen enum not be permitted to have non-public cases.&quot;<br>
<br>
OK. Seems logically for frozen enum(imported from another module) to not have non-public cases, as such cases most<br>
likely will be added later during the evaluation of the library(external module) - so such enum should not be frozen then.<br>
<br>
I&#39;d like to discuss how current decision will fit into the (possible) future &#39;private cases&#39; in enum.<br>
<br>
1. Non-frozen enum with private cases in the same module.<br>
<br>
It seems like we&#39;ll need to write<br>
switch val {<br>
  case .one : ..<br>
  case .two : ..<br>
  unknown default: .. // for private cases, even &#39;val&#39; can&#39;t have &#39;future&#39; cases<br>
}<br>
<br>
So, &#39;unknown default&#39; will mean not just &#39;future cases&#39;, but &#39;future cases and private cases&#39;.<br>
<br>
2. Non-frozen enum with private cases in another module.<br>
<br>
In this case, if we want exhaustive switch, we need to use &#39;unknown default&#39;. But I feel like known but private cases<br>
are not the same as future public cases for the &#39;consumer&#39; of that enum, no?<br>
<br>
I mean, when making a decision what to do inside &#39;unknown default&#39; - isn&#39;t it important to know what is the &quot;event&quot; -<br>
new public case or private(even &quot;known&quot;) case? I&#39;m thinking about something like this:<br>
<br>
let val = getSomeNonFrozenEnumResultFromLibrary()<br>
switch val {<br>
   case .one : ... // process the val on our side<br>
   case .two : ... // process the val on our side<br>
<br>
   private default : sendValueBackToLibraryToProcess(val) // not interested, calling some special handler<br>
   future default : .. // somehow react on important new case introduced in library. for example, show &quot;please update<br>
the app&quot; for the user and cancels the current operation<br>
}<br>
<br>
I don&#39;t think we need to think about &quot;future private&quot; cases, as we don&#39;t have access to them in any case, so current and<br>
future private cases are not distinguishable for us.<br>
<br>
I&#39;m not sure if we should distinct future cases and private cases on &#39;switch&#39; side, but I think we should discuss this<br>
now for taking a correct decision regarding &#39;unknown default&#39; etc.<br>
<br>
P.S. FWIW I agree with Chris Lattner that &#39;unknown default&#39; fits into Swift syntax and mental model much better than<br>
&#39;unknown case&#39;. This handler is for default reacting on _number_ of unknown cases, not for reacting on some _specific_<br>
case, like other &#39;case xxx:&#39; handlers. Are we going to discuss this and select the better name? Or most of us not agree<br>
that &#39;unknown case&#39; is the best?<br>
<br>
Vladimir.<br>
<br>
&gt; Jordan<br>
&gt;<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>
</blockquote></div>