<div dir="ltr">Bumping this thread because it&#39;s relevant to recent discussions in &quot;Proposal: Enum &#39;count&#39; functionality&quot;. To summarize points so far:<div><div><br></div><div>Minimum and particularly maximum rawValues would be useful for integer-typed enums.</div><div><br></div><div>For NS_ENUM/NS_OPTIONS and Swift enums without associated values, something like &quot;allValues&quot; would be useful.</div><div><br></div><div>This functionality could be added at the request of the user, by deriving a protocol such as &quot;enum Foo: ValueEnumerable&quot;.</div><div><br></div><div>Brent (in this thread) and Joe (in the other thread) have proposed Cartesian products for nested &quot;enumerable&quot; enums:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-size:12.8px">        enum Foo {<br></span><span style="font-size:12.8px">                case Alice, Bob<br></span><span style="font-size:12.8px">        }<br></span><span style="font-size:12.8px">        enum Bar {<br></span><span style="font-size:12.8px">                case Charlie (Foo), Eve (Foo, Foo)<br></span><span style="font-size:12.8px">        }<br></span><span style="font-size:12.8px">        Bar.allValues   // =&gt; [ .Charlie(.Alice), .Charlie(.Bob), .Eve(.Alice, .Alice), .Eve(.Alice, .Bob), .Eve(.Bob, .Alice), .Eve(.Bob, .Bob) ]</span><br clear="all"></blockquote><div><div class="gmail_extra"><div><div><div dir="ltr"><div><br></div><div><br></div><div>Barring full Cartesian product support, would it be useful to have some form of &quot;allValues&quot; for enums with associated values, or is the ability to do &quot;if case let&quot; sufficient to discriminate them?</div><div><br></div><div>Jacob Bandes-Storch<br></div></div></div></div>
<br><div class="gmail_quote">On Fri, Dec 11, 2015 at 5:49 PM, Zef Houssney 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Yeah thank you —I did mean the constructor, didn’t think of that terminology :)<div><br></div><div>I recognize that it’s not totally ideal but I do still see that as being useful. Here’s an example of how you could use that. For cases that have the same signature, it’s less ideal but still totally workable as far as I can see.</div><div><br></div><div>Also with this approach you could fairly easily create the data structure you suggested yourself.</div><div><br></div><div><br></div><div><pre style="overflow:auto;font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;margin-top:0px;margin-bottom:16px;line-height:1.45;padding:10px 20px;border-radius:3px;word-wrap:normal;margin-left:15px;color:rgb(51,51,51);background-color:rgb(247,247,247)"><span style="color:rgb(167,29,93)">enum</span> Foo {
    <span style="color:rgb(167,29,93)">case</span> Plain
    <span style="color:rgb(167,29,93)">case</span> AssociatedSimple(<span style="color:rgb(0,134,179)">String</span>)
    <span style="color:rgb(167,29,93)">case</span> AssociatedComplex(<span style="color:rgb(0,134,179)">String</span>, <span style="color:rgb(0,134,179)">Int</span>)
    <span style="color:rgb(167,29,93)">case</span> AssociatedSimpleCopy(<span style="color:rgb(0,134,179)">String</span>)

    <span style="color:rgb(167,29,93)">static</span> <span style="color:rgb(167,29,93)">var</span> cases: [<span style="color:rgb(0,134,179)">Any</span>] {
        <span style="color:rgb(167,29,93)">return</span> [
            Plain,
            AssociatedSimple,
            AssociatedComplex,
            AssociatedSimpleCopy,
        ]
    }
}

<span style="color:rgb(167,29,93)">let</span> cases <span style="color:rgb(167,29,93)">=</span> Foo<span style="color:rgb(167,29,93)">.</span>cases

cases[<span style="color:rgb(0,134,179)">0</span>] <span style="color:rgb(167,29,93)">is</span> Foo <span style="color:rgb(150,152,150)">// true</span>
cases[<span style="color:rgb(0,134,179)">1</span>] <span style="color:rgb(167,29,93)">is</span> Foo <span style="color:rgb(150,152,150)">// false</span>
cases[<span style="color:rgb(0,134,179)">2</span>] <span style="color:rgb(167,29,93)">is</span> Foo <span style="color:rgb(150,152,150)">// false</span>

cases[<span style="color:rgb(0,134,179)">0</span>] <span style="color:rgb(167,29,93)">is</span> (<span style="color:rgb(0,134,179)">String</span>) <span style="color:rgb(167,29,93)">-&gt;</span> Foo <span style="color:rgb(150,152,150)">// false</span>
cases[<span style="color:rgb(0,134,179)">1</span>] <span style="color:rgb(167,29,93)">is</span> (<span style="color:rgb(0,134,179)">String</span>) <span style="color:rgb(167,29,93)">-&gt;</span> Foo <span style="color:rgb(150,152,150)">// true</span>
cases[<span style="color:rgb(0,134,179)">2</span>] <span style="color:rgb(167,29,93)">is</span> (<span style="color:rgb(0,134,179)">String</span>) <span style="color:rgb(167,29,93)">-&gt;</span> Foo <span style="color:rgb(150,152,150)">// false</span>

cases[<span style="color:rgb(0,134,179)">0</span>] <span style="color:rgb(167,29,93)">is</span> (<span style="color:rgb(0,134,179)">String</span>, <span style="color:rgb(0,134,179)">Int</span>) <span style="color:rgb(167,29,93)">-&gt;</span> Foo <span style="color:rgb(150,152,150)">// false</span>
cases[<span style="color:rgb(0,134,179)">1</span>] <span style="color:rgb(167,29,93)">is</span> (<span style="color:rgb(0,134,179)">String</span>, <span style="color:rgb(0,134,179)">Int</span>) <span style="color:rgb(167,29,93)">-&gt;</span> Foo <span style="color:rgb(150,152,150)">// false</span>
cases[<span style="color:rgb(0,134,179)">2</span>] <span style="color:rgb(167,29,93)">is</span> (<span style="color:rgb(0,134,179)">String</span>, <span style="color:rgb(0,134,179)">Int</span>) <span style="color:rgb(167,29,93)">-&gt;</span> Foo <span style="color:rgb(150,152,150)">// true</span>

<span style="color:rgb(167,29,93)">if</span> <span style="color:rgb(167,29,93)">let</span> simple <span style="color:rgb(167,29,93)">=</span> cases[<span style="color:rgb(0,134,179)">1</span>] <span style="color:rgb(167,29,93)">as?</span> (<span style="color:rgb(0,134,179)">String</span>) <span style="color:rgb(167,29,93)">-&gt;</span> Foo {
    <span style="color:rgb(167,29,93)">let</span> created <span style="color:rgb(167,29,93)">=</span> simple(<span style="color:rgb(24,54,145)"><span>&quot;</span>some value<span>&quot;</span></span>)

    <span style="color:rgb(167,29,93)">switch</span> created {
    <span style="color:rgb(167,29,93)">case</span> <span style="color:rgb(167,29,93)">.</span>AssociatedSimple:
        <span style="color:rgb(150,152,150)">// we&#39;d hit this:</span>
        <span style="color:rgb(0,134,179)">print</span>(<span style="color:rgb(24,54,145)"><span>&quot;</span>Simple<span>&quot;</span></span>)
    <span style="color:rgb(167,29,93)">case</span> <span style="color:rgb(167,29,93)">.</span>AssociatedSimpleCopy:
        <span style="color:rgb(150,152,150)">// here if you didn&#39;t want the original &quot;some value&quot;</span>
        <span style="color:rgb(150,152,150)">// you could create the enum with a different value</span>
        <span style="color:rgb(0,134,179)">print</span>(<span style="color:rgb(24,54,145)"><span>&quot;</span>Simple Copy<span>&quot;</span></span>)
    <span style="color:rgb(167,29,93)">default</span>:
        <span style="color:rgb(0,134,179)">print</span>(<span style="color:rgb(24,54,145)"><span>&quot;</span>Something else<span>&quot;</span></span>)
    }
}</pre></div><div><br></div><div>I don’t love that it’s using [Any] here, but I don’t know if it’s possible to represent that `() -&gt; Foo` where the methods passed can be dynamic… didn’t seem to be with what I was trying. Related to that, it might make more sense to have the “Plain” value above represented as `() -&gt; Foo` instead of simply `Foo`.</div><span><div><br></div><div><br></div><div><br></div><div><br><blockquote type="cite">On Dec 11, 2015, at 5:43 PM, Brent Royal-Gordon &lt;<a href="mailto:brent@architechies.com" target="_blank">brent@architechies.com</a>&gt; wrote:<br><br><blockquote type="cite">However, I do have a suggestion that’s different from what Brent suggested, which is that instead of returning actual enum values, I could see returning the functions associated with them as being potentially useful. I can show an example of what this might look like if anyone is interested.<br></blockquote><br>Interesting. The problem I see with this is that, if by “the functions associated with them” you mean their constructors, each constructor would have a different set of parameters. To distinguish between them, you would probably need…an enum.<br><br>On the other hand, if you mean “functions testing an instance of the enum against that case, and returning true if it matches”, that’s a more interesting possibility.<br><br>-- <br>Brent Royal-Gordon<br>Architechies<br><br></blockquote><br></div>
</span><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=P-2BsYbBZHRBuLDBJaL4DIKDNfkkjpROowTyRAObV11qxaiKKOJzMz9GSLXvLG8uWEOfUam-2F515A9ZJAI5zqp3SbJnzpf3uGo8xT-2FVebepSxyR71xShKeJVI4FkGn8jH2B1O5mlGjQOzFIirYIioNcFvMgv578Pi5m9uLGC0fSMdxz1aukE5EZY2vz23nAblu-2BLo390-2FXolXZCkLHvUUmsyL-2BnYlLoF8lSMG9qSHHhcIA-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0px!important;margin:0px!important;padding:0px!important">
</div>
<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>
<br></blockquote></div><br></div></div></div></div>