[swift-evolution] Warning when omitting default case for imported enums

Robert Widmann devteam.codafi at gmail.com
Tue Feb 7 13:45:54 CST 2017


I lean +1, but this answer on its own seems incomplete.  Exhaustiveness is an important property, and it’s not clear what happens here now when you fall through a “complete” case tree without matching a pattern, and in that sense this plan solves a problem.  But it also would hinder a “future-you” from going back and dealing with the ramifications of swapping a dependency for a newer version, in that with a default now covering the rest of the cases the compiler is unable to tell you which cases you are actually missing post-upgrade.

Library Evolution <https://github.com/apple/swift/blob/master/docs/LibraryEvolution.rst> includes what I think is the more complete response here: An @closed attribute for enums where a switch is guaranteed to be exhaustive.  (Though, after the open discussion, I wonder if that keyword can’t be reused in some way to provide the inverse restriction instead).

> On Feb 7, 2017, at 10:12 AM, Tanner Nelson via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Hello Swift Evolution,
> 
> I'd like to propose that a warning be emitted when default cases are omitted for enums from other modules. 
> 
> What this would look like:
> 
> OtherModule:
> ```
> public enum SomeEnum {
>     case one
>     case two
> }
> 
> public let global: SomeEnum = .one
> ```
> 
> executable:
> ```
> import OtherModule
> 
> switch OtherModule.global {
>     case .one: break
>     case .two: break
>     ^~~~~ ⚠︎ Warning: Default case recommended for imported enums. Fix-it: Add `default: break`
> }
> ```
> 
> Why:
> 
> Allowing the omission of a default case in an exhaustive switch makes the addition of a new case to the enum a breaking change. 
> In other words, if you're exhaustively switching on an enum from an imported library, the imported library can break your code by adding a new case to that enum (which the library authors may erroneously view as an additive/minor-bump change).
> 
> Background:
> 
> As a maintainer of a Swift framework, public enums have been a pain point in maintaining semver. They've made it difficult to implement additive features and have necessitated the avoidance of enums in our future public API plans.
> 
> Related Twitter thread: https://twitter.com/tanner0101/status/796860273760104454 <https://twitter.com/tanner0101/status/796860273760104454>
> 
> Looking forward to hearing your thoughts.
> 
> Best,
> Tanner
> 
> Tanner Nelson
> Vapor 
> +1 (435) 773-2831
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170207/9d087a34/attachment.html>


More information about the swift-evolution mailing list