Having reviewed much of the commentary on this proposal, I keep coming back to 
the same thought: why not use @versioned and @available keywords for this 
instead of some concept related to “exhaustive”?

The issue here is not whether a given enum is “exhaustive” over the enumerated 
problem space; it’s whether the developer wants to alter the enum in the future 
without breaking ABI compatibility.

If you call it “exhaustive” then it’s misleading, because all enums at a given 
moment in time can be switched over exhaustively. This will just confuse folks.

Since versioning is really the main goal, why not use the same annotations for 
versioning enums as are used for versioning everything else?

@versioned
enum MyError: Error {
@available(OSX, deprecated:10.11, message: "this error case is going away in 
10.12")
case BadThingHappened

@available(forever)
case ReallyBadThingHappened
}

etc.

That way you could have some cases get removed in the future as well as added, 
and you won’t confuse people by talking about “complete” or “exhaustive”, which 
are terms that are too closely coupled with the meaning and application of a 
given enum to which they refer. 

It would be best to use terms that just say what they mean. We are talking 
about versioning APIs to keep ABI stability? Use @versioned and @available like 
everywhere else. 

Or is there a compelling reason this cannot be done? I read much of the 
arguments here but didn’t see any mention of @versioned... maybe it’s iOS Mail 
app thinking I was looking for an email address that contains @versioned? ;D

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

Reply via email to