<div dir="ltr"><div class="gmail_extra">I have been hoping for the exhaustive pattern matching feature for a while now, and would love to see a proposal.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Austin</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 24, 2016 at 1:01 PM, Matthew Johnson via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Swift currently requires a default pattern matching clause when you switch on an existential or a non-final class even if the protocol or class is non-public and all cases are covered.  It would be really nice if the default clause were not necessary in this case.  The compiler has the necessary information to prove exhaustiveness.<br>
<br>
Related to this is the idea of introducing something like a `sealed` modifier that could be applied to public protocols and classes.  The protocol or class would be visible when the module is imported, but conformances or subclasses outside the declaring module would be prohibited.  Internal and private protocols and classes would implicitly be sealed since they are not visible outside the module.  Any protocols that inherit from a sealed protocol or classes that inherit from a sealed class would also be implicitly sealed (if we didn’t do this the sealing of the superprotocol / superclass could be violated by conforming to or inheriting from a subprotocol / subclass).<br>
<br>
Here are examples that I would like to see be valid:<br>
<br>
protocol P {}<br>
// alternatively public sealed protocol P {}<br>
struct P1: P {}<br>
struct P2: P {}<br>
<br>
func p(p: P) -&gt; Int {<br>
    switch p {<br>
    case is P1: return 1 // alternatively an `as` cast<br>
    case is P2: return 2 // alternatively an `as` cast<br>
    }<br>
}<br>
<br>
class C {}<br>
// alternatively public sealed class C {}<br>
class C1: C {}<br>
class C2: C {}<br>
<br>
func c(c: C) -&gt; Int {<br>
    switch c {<br>
    case is C1: return 1 // alternatively an `as` cast<br>
    case is C2: return 2 // alternatively an `as` cast<br>
    case is C: return 0   // alternatively an `as` cast<br>
    }<br>
}<br>
<br>
I am wondering if this is something the community is interested in.  If so, I am wondering if this is something that might be possible in the Swift 3 timeframe (maybe just for private and internal protocols and classes) or if it should wait for Swift 4 (this is likely the case).<br>
<br>
-Matthew<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div><br></div></div>