<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>I don't think I've ever wanted to distribute the patterns of a switch statement across multiple files. It seems like you want an enum of enums if the code you're writing needs this kind of chunking. Distributing cases is also far more brittle than the existing local switch; failing to include a file in the build that covers necessary cases now becomes a module-level error rather than a statement-local one. Finally, the proposal seems to do the opposite of consolidate and simplify code by introducing quite a lot of syntax around what it aims to do, and by muddying the meaning of a keyword that was previously only meant for types.</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">A few conceptual questions:</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">How does this interact with versioned cases? </div><div id="AppleMailSignature">What about enums that carry values?<br><br>~Robert Widmann</div><div><br>2017/01/06 23:59、Tim Shadel via swift-evolution <<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> のメッセージ:<br><br></div><blockquote type="cite"><div><meta http-equiv="content-type" content="text/html; charset=utf-8"><div><p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Idea: Consolidate the Code for Each Case in an Enum</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"># Motivation:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Consolidate all code related to a single enum case in one spot. This makes it easier to ensure that all the pieces mesh coherently across that one case.</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"># Background:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Enum cases _feel_ like separately defined, but tightly related structs because each case can have distinct associated values. They have special privileges that a family of structs doesn't have, like `self = .otherCase`. Enums are really awesome.</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"># Proposed Solution:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Any `func` or dynamic `var` that provides a unique response per `case` uses a `switch` to do so. I propose to hide that standard `switch` behind some syntactic sugar. Possibly `extension MyEnum.myCase`, assuming that nothing extra is allowed there (protocol conformance, generic constraints, etc.).</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Here's a typical example of a (simplified) enum that represents 2 states, and conforms to 2 protocols, each requiring different dynamic values based on the case of the enum. In both places, an outer `switch` is used to select the current enum case, and the logic within each branch further determines the value returned.</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">protocol State {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> mutating func react(to event: Event)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">}</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">enum TokenState: State, CustomStringConvertible {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case expired(at: Date)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case validated(token: String)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> var description: String {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> switch self {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case let .expired(at):</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> return "Expired at \(at)"</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case let .validated(token):</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> return "Token \(token) has been validated."</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> mutating func react(to event: Event) {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> switch self {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case .expired:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> switch event {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case _ as TokenRefreshed:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> self = .validated(token: event.token)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> default:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> break</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case .validated:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> switch event {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case _ as TokenRejected:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> self = .expired(at: Date())</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case _ as UserLoggedOut:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> self = .expired(at: Date())</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> default:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> break</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial; min-height: 13.8px;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> </span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">}</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">If we instead allow all the code for each enum case to be consolidated, this new code looks much more like the rest of the code we write in Swift. Real world enums frequently have many more cases, and as the number of enum cases grows consolidating all their logic is increasingly helpful. The following proposal is identical to the code above, it simply "hides" the outer switch statement of each value.</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">enum TokenState: State, CustomStringConvertible {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case expired(at: Date)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case validated(token: String)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">}</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">extension TokenState.expired {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> var description: String {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> return "Token expired at \(<a href="http://self.at">self.at</a>)"</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial; min-height: 13.8px;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> </span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> mutating func react(to event: Event) {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> switch event {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case _ as TokenRefreshed:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> self = .untested(token: event.token)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> default:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> break</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">}</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">extension TokenState.validated {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial; min-height: 13.8px;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> </span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> var description: String {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> return "Token \(self.token) has been validated."</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial; min-height: 13.8px;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> </span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> mutating func react(to event: Event) {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> switch event {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case _ as TokenRejected:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> self = .expired(at: Date())</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case _ as UserLoggedOut:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> self = .expired(at: Date())</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> default:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> break</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial; min-height: 13.8px;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> </span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">}</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">I've also shown automatic binding of each case's associated values to properties available on `self` ... but maybe it's better if they're bound to variable references captured the way a closure does. I'm not an expert in this part.</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Back to the meat of the idea, what happens when a case isn't extended, or only partially extended? Because it's simply a fancy `switch`, it still must be exhaustive or provide a `default` branch.</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">extension TokenState.expired {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> var description: String {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> return "Token expired at \(<a href="http://self.at">self.at</a>)"</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial; min-height: 13.8px;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> </span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> <<< error: react(to:) must be exhaustively defined. Missing implementation for case .expired</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">}</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Can be mitigated with:</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">enum TokenState: State, CustomStringConvertible {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case expired(at: Date)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> case validated(token: String)</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> // This becomes the `default` branch in the generated `switch`</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> mutating func react(to event: Event) {</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> print("Ignoring \(event) in case \(self)")</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"> }</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">}</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">```</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;"></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; -webkit-text-stroke-color: rgb(0, 0, 0); -webkit-text-stroke-width: initial;"><span style="font-size: 12pt; -webkit-font-kerning: none;">Note that this implementation for the `default` branch is just that. This is not creating a superclass/subclass relationship between the `enum` and the `case`, it's merely a convenient way to construct a `switch` statement. I'm not proposing to deprecate any existing source, merely introduce a more convenient form of a very typical pattern, so I hope it is source-compatible by the definition you guys are using.</span></p><div><span style="font-size: 12pt; -webkit-font-kerning: none;"><br></span></div><div><span style="font-size: 12pt; -webkit-font-kerning: none;">Thoughts?</span></div><br><div>--Tim</div></div></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></body></html>