Thanks for your thoughts.

I think 3) is indeed a very common case, but also not affected by this proposal 
or the general issue at all. Unless I’m missing something, I think it makes 
sense to limit the discussion to those enums that are typically switched over 
in client code.

I don’t think 1) outnumbers 2), which is exactly why I think it is important to 
have some sort of exhaustive-checking for 2). If 2) was an edge cases, I 
wouldn’t mind, because 1) behaves the same way with or without the 
implementation of this proposal.

What I was trying to say is: 99% of the times I switch over an enum, I do want 
to consider all available cases in my code, which also means I want to be 
informed (by a warning) if I’m missing something. Without anything like 
`future`, I’ll end up with switches that used to be exhaustive, but are not 
anymore when the library author adds a case, and I don’t learn about it until I 
hit such a case at runtime (documentation aside), which may rarely happen. I’m 
aware that there may be a period of time during which I haven’t updated my code 
and my code has to deal with unexpected cases, but as soon as I get to compile 
my code with the current SDK, I’d like to learn about new cases.


> On 20. Dec 2017, at 11:39, Brent Royal-Gordon <br...@architechies.com> wrote:
> 
>> On Dec 20, 2017, at 1:00 AM, Sebastian Hagedorn via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>>  The expectation is that switches over non-exhaustive enums are uncommon.
>> 
>> 
>> Basically every time I interact with an enum, I switch over it, to make sure 
>> I don’t forget anything, and to make sure I reconsider my code if the 
>> library changes. Since most SDK enums will become non-exhaustive, this is 
>> the 99% case for me.
> 
> Is that typical of your interactions with, say, `UIViewAnimationTransition`?
> 
> There are three categories of enums in the SDK:
> 
>       1) Those which you switch over and which are inherently exhaustive. For 
> example, `ComparisonResult` will never, ever have a case besides 
> `orderedAscending`, `orderedSame`, and `orderedDescending`. All possible 
> values fit into one of these three categories (other than those for which 
> comparison is not a valid operation). You want an exhaustive switch for these.
> 
>       2) Those which you switch over but which could have cases added in the 
> future. For example, `SKPaymentTransactionState` (representing the state of 
> an in-app purchase) may sometimes need additional cases; one was already 
> added in iOS 8 for a parental permission feature. You want a nonexhaustive 
> switch for these, with a `default` clause containing some fallback behavior 
> (like skipping the associated entry or showing an error message).
> 
>       3) Those which you almost never switch over at all; they are simply 
> used as opaque inputs to APIs in the same framework. For example, very few 
> pieces of code ever need to examine or use a `UIViewAnimationTransition`; 
> they just need to pass one into the proper UIKit animation APIs. (Error types 
> are another example—you should catch specific errors you know you want to 
> handle specially, but you should never imagine that you have thought of all 
> possible errors.) You basically don't care about the switch behavior of these 
> enums; the compiler could even ban switching over them and you would probably 
> never notice.
> 
> Category 1 enums should be exhaustive; category 2 and 3 should be 
> nonexhaustive. So the question is, do category 1 enums outnumber category 2 
> and 3? You seem to suggest that they do, but I very much doubt that. My 
> suspicion is that category 3 is the most common, followed by category 2, with 
> category 1 bringing up the rear. The authors of the proposal say they 
> surveyed Foundation enums to test this theory:
> 
>> To see how this distinction will play out in practice, I investigated the 
>> public headers of Foundation in the macOS SDK. Out of all 60 or so NS_ENUMs 
>> in Foundation, only 6 of them are clearly exhaustive:
>> 
>>      • ComparisonResult
>>      • NSKeyValueChange / NSKeyValueSetMutationKind
>>      • NSRectEdge
>>      • FileManager.URLRelationship
>>      • maybe Decimal.CalculationError
>> 
>> ...with a handful more that could go either way, such as Stream.Status. This 
>> demonstrates that there is a clear default for public enums, at least in 
>> Objective-C.
> 
> Maybe a survey of another library like Alamofire would show different 
> results; if you think it would, by all means feel free to demonstrate it.
> 
> Having said that, I too think that `future` or `unknown` is a good idea, and 
> I think we should strongly consider adding it. Doing so would restore many of 
> the correctness benefits of exhaustiveness checking to nonexhaustive enums, 
> significantly reducing the painful parts of this feature.
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 

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

Reply via email to