Is this equivalent to `default: break`? `default: fatalError()`? I think it's 
better to write such things explicitly.

Jordan


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

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to