<div dir="ltr"><div>I&#39;d like to discuss the possibility of treating the cases of a given enum as if they are subtypes of that enum. This seems like a natural thing to do because enum cases (especially when they have associated values) effectively define a closed set of subtypes.</div><div><br></div><div>Doing so would allow for constructions such as the following:</div><div><br></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">enum Foo {</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace"><span style="white-space:pre">  </span>case a(name: String)</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">}</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace"><br></font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">func isA(foo: Foo) -&gt; Bool {</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  // The old way:</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  if case .a = foo { return true }</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  return false</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  // The new way:</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  return foo is .a</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">}</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace"><br></font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">func printNameIfFooIsA(foo: Foo) -&gt; Bool {</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  // The old way:</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  if case let .a(name) = foo {</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">    print(name)</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  }</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  // The new way (1):</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  if let a = foo as? .a {</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">    print(<a href="http://a.name">a.name</a>)</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  }</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  // The new way (2):</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  if let name = (foo as? .a)?.name {</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">    print(name)</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">  }</font></span></div><div><span style="background-color:rgb(255,255,255)"><font face="monospace, monospace">}</font></span></div><div><br></div><div>Treating an enum&#39;s cases as its subtypes would make enums easier to work with because handling them would be syntactically the same as handling other types.</div><div><br></div><div>The pattern matching capabilities of enums wouldn&#39;t be affected by this proposal.</div><div><br></div><div>Multiple other proposals have already attempted to simplify enum handling (they have particularly focused on getting rid of &quot;if case&quot; and adding the ability to treat enum case tests as expressions), but none of the solutions presented in those proposals have worked out so far.</div><div><br></div><div>I believe that this could be the right solution to multiple enum-related problems that have been brought up repeatedly.</div><div><br></div></div>