<div dir="ltr">I&#39;ve had a draft of a proposal lying around for a while which addresses exactly this, but I haven&#39;t gotten around to sending it out for comments yet. <a href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5">Link</a>.<div><br></div><div>Would appreciate if you guys took a look.</div><div>Dan Appel<br></div><div><br><div>Pasted inline below<br><div><br></div><div><h1 style="font-size:2.25em;margin:0px 0px 16px;line-height:1.2;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;">Extensible Enums</h1><ul style="padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px"><li style="box-sizing: border-box;">Proposal: <a href="https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-name.md" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none">SE-NNNN</a></li><li style="box-sizing: border-box;">Author: <a href="https://github.com/danappelxx" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none">Dan Appel</a></li><li style="box-sizing: border-box;">Status: <span style="box-sizing: border-box;"><a href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5#rationale" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none">Awaiting review</a></span></li><li style="box-sizing: border-box;">Review manager: TBD</li></ul><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;"><a id="inbox-user-content-introduction" class="inbox-anchor" href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5#introduction" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1"></a>Introduction</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">This proposal introduces a new keyword that can be applied to enums which allows new cases to be introduced in extensions.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">Swift-evolution thread: <a href="https://lists.swift.org/pipermail/swift-evolution" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none">[RFC] Extensible Enums</a></p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;"><a id="inbox-user-content-motivation" class="inbox-anchor" href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5#motivation" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1"></a>Motivation</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">Enums are a powerful feature which provides a lot of benefit if you have a limited number of behaviors. For example, associated values provide the ability to make every case essentially a separate type. However, due to the static nature of enums, they cannot be used in situations where they would otherwise be a perfect fit. </p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">An example of this would be the use of an Error enum like so:</p><div class="inbox-highlight inbox-highlight-source-swift" style="margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px"><pre style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal"><span class="inbox-pl-k" style="color:rgb(167,29,93)">enum</span> FileError: ErrorProtocol {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> fileNotFound(path: <span class="inbox-pl-c1" style="color:rgb(0,134,179)">String</span>)
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> corruptedFile(bytes: [<span class="inbox-pl-c1" style="color:rgb(0,134,179)">Int8</span>])
}
<span class="inbox-pl-k" style="color:rgb(167,29,93)">func</span> <span class="inbox-pl-en" style="color:rgb(121,93,163)">readFile</span>() throws { <span class="inbox-pl-k" style="color:rgb(167,29,93)">...</span> }

<span class="inbox-pl-c" style="color:rgb(150,152,150)">// elsewhere in the codebase</span>
<span class="inbox-pl-k" style="color:rgb(167,29,93)">do</span> {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">try</span> readFile()
} <span class="inbox-pl-k" style="color:rgb(167,29,93)">catch</span> <span class="inbox-pl-k" style="color:rgb(167,29,93)">let</span> error <span class="inbox-pl-k" style="color:rgb(167,29,93)">as</span> FileError {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">switch</span> error {
        <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> <span class="inbox-pl-k" style="color:rgb(167,29,93)">.</span>fileNotFound(<span class="inbox-pl-k" style="color:rgb(167,29,93)">let</span> path): <span class="inbox-pl-c" style="color:rgb(150,152,150)">// handle error</span>
        <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> <span class="inbox-pl-k" style="color:rgb(167,29,93)">.</span>corruptedFile(<span class="inbox-pl-k" style="color:rgb(167,29,93)">let</span> bytes): <span class="inbox-pl-c" style="color:rgb(150,152,150)">// handle error</span>
    }
} <span class="inbox-pl-k" style="color:rgb(167,29,93)">catch</span> { <span class="inbox-pl-k" style="color:rgb(167,29,93)">...</span> }</pre></div><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">While this is generally a good approach, it can be very dangerous for library consumers if the author exposes the error to the user. This is due to the fact that the <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">switch</code> statement has to be exhaustive and is only satisfied when all enum cases have been accounted for. What this means for library authors is that every time they add a new case to a public enum, they are breaking the exhaustivity of the <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">switch</code> and making their library backwards-incompatible.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">Currently, the best workaround is to use a <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">struct</code> with static instances and overloading the <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">~=</code> operator. This allows for similar <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">switch</code> behavior but overall is much less flexible, missing key features such as associated values.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">Another example is when the library is split into multiple modules, where the error is defined in the first module and the second module wants to add some error cases. An enum is very rarely used in this case because you cannot add cases in other modules. Instead, library authors either use an error protocol, and add more types that conform to it, or use the struct approach shown above. While this is not terrible, adding cases in extensions would better translate the intention of the author and adds more flexiblity.</p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;"><a id="inbox-user-content-proposed-solution" class="inbox-anchor" href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5#proposed-solution" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1"></a>Proposed solution</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">The solution proposed is quite simple: add an <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">extensible</code> keyword/modifier that can be applied to enums, which would require the <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">default</code> case when switched on and allow new cases to be added in extensions.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">Here is the translation of the very first example to the use an <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">extensible</code> enum instead, with a new case added:</p><div class="inbox-highlight inbox-highlight-source-swift" style="margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px"><pre style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal">extensible <span class="inbox-pl-k" style="color:rgb(167,29,93)">enum</span> ThingError: ErrorProtocol {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> fileNotFound(path: <span class="inbox-pl-c1" style="color:rgb(0,134,179)">String</span>)
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> corruptedFile(bytes: [<span class="inbox-pl-c1" style="color:rgb(0,134,179)">Int8</span>])
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> failedReadingFile
}
<span class="inbox-pl-k" style="color:rgb(167,29,93)">func</span> <span class="inbox-pl-en" style="color:rgb(121,93,163)">readFile</span>() throws { <span class="inbox-pl-k" style="color:rgb(167,29,93)">...</span> }

<span class="inbox-pl-c" style="color:rgb(150,152,150)">// elsewhere in the codebase</span>
<span class="inbox-pl-k" style="color:rgb(167,29,93)">do</span> {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">try</span> readFile()
} <span class="inbox-pl-k" style="color:rgb(167,29,93)">catch</span> <span class="inbox-pl-k" style="color:rgb(167,29,93)">let</span> error <span class="inbox-pl-k" style="color:rgb(167,29,93)">as</span> ThingError {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">switch</span> error {
        <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> <span class="inbox-pl-k" style="color:rgb(167,29,93)">.</span>fileNotFound(<span class="inbox-pl-k" style="color:rgb(167,29,93)">let</span> path): <span class="inbox-pl-c" style="color:rgb(150,152,150)">// handle error</span>
        <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> <span class="inbox-pl-k" style="color:rgb(167,29,93)">.</span>corruptedFile(<span class="inbox-pl-k" style="color:rgb(167,29,93)">let</span> bytes): <span class="inbox-pl-c" style="color:rgb(150,152,150)">// handle error</span>
        <span class="inbox-pl-k" style="color:rgb(167,29,93)">default</span>: <span class="inbox-pl-c" style="color:rgb(150,152,150)">// handle future errors that don&#39;t exist yet</span>
    }
} <span class="inbox-pl-k" style="color:rgb(167,29,93)">catch</span> { <span class="inbox-pl-k" style="color:rgb(167,29,93)">...</span> }</pre></div><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">For the second example, we can simply extend the enum in the higher-level module.</p><div class="inbox-highlight inbox-highlight-source-swift" style="margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px"><pre style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal"><span class="inbox-pl-c" style="color:rgb(150,152,150)">// Module FileProtocol</span>

extensible <span class="inbox-pl-k" style="color:rgb(167,29,93)">enum</span> FileError: ErrorProtocol {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> fileNotFound(path: <span class="inbox-pl-c1" style="color:rgb(0,134,179)">String</span>)
}

<span class="inbox-pl-k" style="color:rgb(167,29,93)">protocol</span> FileProtocol {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">func</span> <span class="inbox-pl-en" style="color:rgb(121,93,163)">read</span>() throws
}

<span class="inbox-pl-c" style="color:rgb(150,152,150)">// Module File</span>

<span class="inbox-pl-k" style="color:rgb(167,29,93)">extension</span> FileError {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> corruptedFile(bytes: [<span class="inbox-pl-c1" style="color:rgb(0,134,179)">Int8</span>])
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">case</span> failedReadingFile
}

<span class="inbox-pl-k" style="color:rgb(167,29,93)">struct</span> File: FileProtocol {
    <span class="inbox-pl-k" style="color:rgb(167,29,93)">func</span> <span class="inbox-pl-en" style="color:rgb(121,93,163)">read</span>() throws { <span class="inbox-pl-k" style="color:rgb(167,29,93)">...</span> }
}</pre></div><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;"><a id="inbox-user-content-detailed-design" class="inbox-anchor" href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5#detailed-design" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1"></a>Detailed design</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">A new keyword would be added to the language which is only allowed in front of the <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">enum</code> keyword. When an enum is marked <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">extensible</code>, new cases can be added in extensions and switches that are performed on it require a <code style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">default</code>case.</p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;"><a id="inbox-user-content-impact-on-existing-code" class="inbox-anchor" href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5#impact-on-existing-code" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1"></a>Impact on existing code</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">There is no impact on existing code since this is purely an additive feature.</p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;"><a id="inbox-user-content-alternatives-considered" class="inbox-anchor" href="https://gist.github.com/Danappelxx/41b7c2e86787f75698bd48135cc616f5#alternatives-considered" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1"></a>Alternatives considered</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px">No alternatives have been considered (yet).</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;helvetica neue&#39;,helvetica,&#39;segoe ui&#39;,arial,freesans,sans-serif,&#39;apple color emoji&#39;,&#39;segoe ui emoji&#39;,&#39;segoe ui symbol&#39;;font-size:16px"><br></p></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jun 30, 2016 at 1:04 PM David Sweeris via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">By itself, this would break switch statements, since they have to be exhaustive.<br>
<br>
If anyone has any ideas about how to fix that, I&#39;m all ears.<br>
<br>
- Dave Sweeris<br>
<br>
&gt; On Jun 30, 2016, at 14:58, Edward Valentini via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; I am finding myself in a situation where the most elegant &quot;swifty&quot; solution would be to allow enum extensions to add to existing case options.  For example lets say I&#39;m using a library that has the following enum defined:<br>
&gt;<br>
&gt; enum MyDirection {<br>
&gt;   case east, west<br>
&gt; }<br>
&gt;<br>
&gt; My app for example also makes use of north and south, so I would love to be able to write:<br>
&gt;<br>
&gt; extension MyDirection {<br>
&gt;   case north,south<br>
&gt; }<br>
&gt;<br>
&gt; In objective c, one would probably have defined constants like MyDirectionEast etc...  these would probably have been mapped to ints or strings so a consumer of this library could have easily extended this to add additional functionality, but using constants like that is not very &quot;swifty&quot;<br>
&gt;<br>
&gt; I&#39;m curious what the swift community thinks.<br>
&gt;<br>
&gt; Thank you<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">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><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr"><div><div>Dan Appel<br></div></div></div></div>