Hi Jordan,

One thing I’m still not clear on exhaustive vs non-exhaustive…

What will stop a developer from releasing an exhaustive enum in version 1 of 
their library, and then adding a new case in version 2?

With ABI stability and libraries getting updated independently of apps, this 
can be a major problem.

Dave


> On Sep 18, 2017, at 11:48 AM, Jordan Rose via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I don't think unit tests help much here. In the case where an 'exhaustive' 
> enum ought to be 'nonexhaustive', unit tests wouldn't help you catch the 
> issue until you tried adding a new case. And in both cases, a unit test would 
> only help if you tried to switch exhaustively over the enum, something you 
> may not think to write (depending on what the enum is, of course).
> 
> In either direction, there's a potential error of omission, and if you've 
> "omitted" the annotation from your library code I wouldn't assume you'd 
> remember to check that specific thing in a unit test.
> 
> Jordan
> 
> 
>> On Sep 16, 2017, at 00:44, Goffredo Marocchi <pana...@gmail.com 
>> <mailto:pana...@gmail.com>> wrote:
>> 
>> Sorry for being naive, but aside from open (and the decision not to make it 
>> the default which again hurts the users of the library),  wouldn’t the 
>> playground library example be ok if the framework author had validated it 
>> with unit tests?
>> 
>> Sent from my iPhone
>> 
>> On 16 Sep 2017, at 01:07, Jordan Rose via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> Hi, Rex. I definitely agree that 'exhaustive' is the right model for a 
>>> multi-module app; indeed, there's no real reason for a single project to do 
>>> anything else. However, it is not always the right behavior for libraries 
>>> that actually get distributed, whether as source or as binary. In this case 
>>> we want to minimize the error of omission: in the app case, forgetting 
>>> "exhaustive" is an annoyance that you notice and fix once across your code 
>>> base, but in the library case forgetting the "default case" means putting 
>>> out a source-breaking release, and for libraries that have binary 
>>> compatibility constraints there's no recourse at all.
>>> 
>>> While most of the proposal deals with the experience we've had with the 
>>> Apple SDKs (as written in Objective-C), we actually have run into this case 
>>> in Swift already. The Swift Playgrounds app comes with a framework, 
>>> PlaygroundSupport, that can be used from within a playground. It's 
>>> important that when they upgrade the app, existing playgrounds don't break, 
>>> since the end user may not have access to the entire code of the 
>>> playground. (Remember that playgrounds are often authored by one developer 
>>> or group, but then run and modified by someone else with a much lower skill 
>>> level!) That means that PlaygroundSupport can't currently vend any enums 
>>> that they expect playground authors to exhaustively switch over.
>>> 
>>> (And to make it even more specific—and appealing—one of the enums they were 
>>> considering would be a representation of the Swift AST. This can obviously 
>>> change from release to release, but previous switch statements should stay 
>>> valid.)
>>> 
>>> Now, this is an example we know about, so we could certainly make it 
>>> explicitly non-exhaustive. But in general we're in the same situation as 
>>> 'open': if we want to be friendly to library authors, we need to make the 
>>> default thing be the one that promises less, even if it means a bit of 
>>> extra work in the "I-actually-own-everything" case.
>>> 
>>> Best,
>>> Jordan
>>> 
>>> 
>>>> On Sep 15, 2017, at 15:47, Rex Fenley <r...@remind101.com 
>>>> <mailto:r...@remind101.com>> wrote:
>>>> 
>>>> Hey Jordan,
>>>> 
>>>> Thank you for the time writing this up. I've been following along to the 
>>>> discussion somewhat closely and have kept silent because `exhaustive` was 
>>>> originally set to be the default for enums. However, that changed and so 
>>>> I'd like to voice my opinion, I frankly don't like this idea.
>>>> 
>>>> At remind we use algebraic data types religiously for managing state and 
>>>> data and rely on exhaustive pattern matching to guarantee we're handling 
>>>> all states in our code. We're splitting out our code across modules and 
>>>> having this guarantee has been a joy to work with.
>>>> 
>>>> The benefit of making nonexhaustive the default for Swift 5 across all 
>>>> multi-module code (besides C code) seems minimal to me. If a developer 
>>>> feels like they're unnecessarily managing enum cases, they can simply add 
>>>> a `default` case whenever they please. This is already the case and I'm 
>>>> curious if there's every been any complaints about this and what they 
>>>> would be. I'd prefer to be cautious and force exhaustive pattern matching 
>>>> in all possible cases and leave it up to the developer to choose not to.
>>>> 
>>>> Ideally in my mind, these keywords won't be necessary. All Swift enums 
>>>> will remain as they are, exhaustively pattern matched by default. Enums 
>>>> from C code will be explicitly nonexhaustive in all cases.
>>>> 
>>>> -- 
>>>> Rex Fenley  |  IOS DEVELOPER
>>>> 
>>>> 
>>>> Remind.com <https://www.remind.com/> |  BLOG <http://blog.remind.com/>  |  
>>>> FOLLOW US <https://twitter.com/remindhq>  |  LIKE US 
>>>> <https://www.facebook.com/remindhq>
>>> _______________________________________________
>>> 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

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

Reply via email to