[swift-evolution] [Review] SE 0192 - Non-Exhaustive Enums

Javier Soto javier.api at gmail.com
Sat Jan 6 17:12:14 CST 2018


What doesn't happen today? The issue is not when they ship a new SDK: When
rebuilding your app against it, you'll get a warning for a missing case.
The problem is when running the app against a newer iOS version with a
newer version of the SDK where the enum has a new case.
On Sat, Jan 6, 2018 at 3:10 PM Jon Shier <jon at jonshier.com> wrote:

> Except it clearly doesn’t happen today when Apple ships new SDKs.
> Obviously there’s an alternate mechanism used in that case. I’m just
> curious what it is and why Swift so desperately needs an alternative.
>
>
> Jon
>
> On Jan 6, 2018, at 5:49 PM, Javier Soto <javier.api at gmail.com> wrote:
>
> This is very much an issue in Obj-C today. If you have an NS_ENUM defined
> with cases A, B, and C, this switch is correct:
>
> int foo;
> swith (e) {
> case A: foo = 0; break;
> case B: foo = 1; break;
> case C: foo = 2; break;
> }
>
> (Note the lack of a default case)
>
> If that enum is defined in a framework and it changes after the app is
> compiled (like it's the case with Apple frameworks), then that code
> produces no warning, yet the foo variable will have a garbage value
> (undefined behavior, but as far as the compiler can tell at compile time
> your code is fine)
>
> Adding a default clause to that switch has the downside of not getting
> warnings for new added cases, like has been discussed before, which is very
> useful.
> On Fri, Jan 5, 2018 at 7:11 PM Jon Shier via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>> At this point I think it might be useful to outline how binary
>> compatibility works for Objective-C on Apple platforms right now. As an app
>> developer I’m not intimately familiar with what happens when you run an app
>> compiled with the iOS 10 SDK on iOS 11. Are there just runtime checks to
>> call old code paths or something else? The more this thread goes on the
>> more confused I get about why Swift would have this issue while it doesn’t
>> appear to be one for Obj-C. If an enum adds a case now, I don’t have to
>> care until I recompile using the new SDK. Is the intention for Swift to be
>> different in this regard?
>>
>>
>>
>> Jon Shier
>>
>> On Jan 5, 2018, at 6:41 PM, Jordan Rose via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>>
>>
>> On Jan 3, 2018, at 00:54, Jason Merchant via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>> Is it hard to imagine that most everyone can get what they want and keep
>> the syntax clean and streamlined at the same time? Without any "@" signs or
>> other compiler hints?
>>
>>
>> For what it's worth, the original version of the proposal started with a
>> modifier (a context-sensitive keyword, like 'final'), but the core team
>> felt that there were a lot of modifiers in the language already, and this
>> didn't meet the bar.
>>
>>
>> "Rather, we are how to enable the vendor of a nonexhaustive enum to add
>>> new cases without breaking binaries compiled against previous versions"
>>
>>
>> When an enum changes, and the change causes the code to break, the user
>> can be presented with migration options from an automated IDE tool. In what
>> specific way does this not solve the issue about having to upgrade your
>> code when using someone else's code library? This very notion implies your
>> disgruntled about doing work when things are upgraded, is that really what
>> this fuss is all about?
>>
>> A well written language interpreter and auto-tooling IDE would not need
>> hints embedded in the code syntax itself. Migration hints from version to
>> version should not be a part of either the past or future version of the
>> code library.
>>
>>
>> Thanks for bringing this up! Unfortunately, it falls down in practice,
>> because if there's a new enum case, *it's unclear what you want to do
>> with it.* If you're handling errors, it's not obvious that the way
>> you've handled any of the *other* errors is appropriate. In the
>> (admittedly controversial) SKPaymentTransactionState case, none of the
>> existing code would be appropriate to handle the newly-introduced
>> "deferred" case, and nor could StoreKit provide "template" code that would
>> be appropriate to the client app.
>>
>>
>> In any case, though, the key point on this particular quoted sentence is
>> "without breaking *binaries"*. Any such change must be valid *without* recompilation,
>> and indeed without any intervention from the developer or an IDE, because
>> that's what happens when the user updates their OS.
>>
>> Jordan
>>
>>
>>
>>
>> ...
>>
>> I don't expect the community to agree on language grammar, but the common
>> sense here on how to achieve the intended goals seems to be out of wack.
>>
>> If someone can present a clear logical statement as to how an automated
>> migration tool behind the scenes in the IDE to handle all your versioning
>> worries, does not make this whole discussion about adding more convoluted
>> syntax additions irrelevant, I'd love to hear it.
>>
>> ___________________
>>
>> Sincerely,
>> Jason
>>
>>
>>
>>
>>
>>
>> On Tue, Jan 2, 2018 at 12:36 PM, Xiaodi Wu <xiaodi.wu at gmail.com> wrote:
>>
>>> On Tue, Jan 2, 2018 at 12:11 PM, Jason Merchant via swift-evolution <
>>> swift-evolution at swift.org> wrote:
>>>
>>>> I think this whole thing has been unnecessarily convoluted. As a
>>>> result, the majority of the replies are rabbit holes.
>>>>
>>>> In my opinion, the true root of the concept in question is as follows:
>>>>
>>>> *A list of something is desired:*
>>>> 1 - Pancake
>>>> 2 - Waffle
>>>> 3 - Juice
>>>>
>>>> *Developer wishes to be able to:*
>>>> *A)* Add new things to the list of choices in the future as they come
>>>> up with new ideas
>>>> *B)* Sometimes select one of the choices to be chosen as the normal
>>>> choice if no choice is made by the user
>>>>
>>>> A and B are *separate desires*. In some circumstances a developer may
>>>> want to add a new choice and make it the normal choice when there was no
>>>> normal choice was clarified before.
>>>>
>>>
>>> I don't think this is an accurate summary of the problem being tackled
>>> here. Rather, we are how to enable the vendor of a nonexhaustive enum to
>>> add new cases without breaking binaries compiled against previous versions.
>>> There is little here to do with what a "default" should be. Indeed, it is
>>> an explicit design decision of Swift not to support types having an
>>> implicit default value.
>>>
>>>
>>>> ____________________
>>>>
>>>> *Part 2:*
>>>>
>>>> After this simple desire is clear, there should be two discussions:
>>>> *A)* In a text only coding language, what would we like the syntax to
>>>> look like? (Without regard to past-bias. What should it really be, forget
>>>> what mistaken design choices were made in Swift in the past)
>>>> *B)* How do we approach making this happen behind the scenes?
>>>>
>>>> *Bonus:* Given that some of us have changed our approach to
>>>> programming significantly beyond text based coding, and into more dynamic
>>>> mediums of programming in other niches, and even here and there in Xcode -
>>>> I would recommend considering how the IDE would show a modern version of
>>>> this concept. I feel too often that Swift design syntax has a *lack of
>>>> awareness between the distinctions of what the IDE should do, as opposed to
>>>> what the syntax of the language should be*, and what should be handled
>>>> behind the scenes by automated tooling.
>>>>
>>>> _____________________
>>>>
>>>> *My opinion*, in answering the above questions is in preference to a
>>>> simple easy to read and write syntax, something like the following:
>>>>
>>>> choices Breakfast {
>>>>     Pancake, *Waffle*, Juice
>>>> }
>>>>
>>>> If a "default" choice is desired, it is obvious to me that I would
>>>> select the choice from the IDE, and it would be visually indicated that it
>>>> was the default.
>>>>
>>>> When changes occur, whether new choices are added, old ones are removed
>>>> or changed, or a default is added, changed, or removed - a behind the
>>>> scenes automated tool analyzes the changes and presents migration options
>>>> through the IDE.
>>>>
>>>> _____________________
>>>>
>>>> Sincerely,
>>>> Jason
>>>>
>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>
>>>>
>>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
> --
> Javier Soto
>
> --
Javier Soto
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20180106/28247076/attachment.html>


More information about the swift-evolution mailing list