<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Regarding support for enums with associated values, I’d like to argue for the idea of returning the constructors along side the instances of simple enum cases.</div><div class=""><br class=""></div><div class="">I find that it’s common to have enums that have mostly simple cases, but a couple with associated values that provide more dynamic customization. I would hate to be unable to include the cases with associated values in order to get conformance for this feature. Here’s an example of something like that. The concept is that you have an enum that defines a number of built-in color schemes, but provides a mechanism for users to dynamically create their own color schemes:</div><div class=""><br class=""></div><div class=""><a href="https://gist.github.com/zef/c6069ed4ed11e41661bf" class="">https://gist.github.com/zef/c6069ed4ed11e41661bf</a></div><div class=""><br class=""></div><div class=""><div class="">I have other real-world ideas for where this would be useful too. This is a contrived example that is simplified such that it would be just as easy to implement the result without the constructor being included in the list of cases (or allValues), but there are use-cases for where there are multiple cases with the same constructor signature where it would be valuable for them to be included.</div></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><div class="">Joe Groff said:</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class="">Asking for the collection of case const<span id="x-apple-selection:end"></span>ructors seems like a different thing to me—you're getting a [(Payload) -&gt; Self] rather than a [Self] collection.<br class=""></blockquote></div><div class=""><br class=""></div><div class="">I agree that this is kind of a problem, but I find this a better tradeoff than the alternatives, which as I see them are:</div><div class=""><div class=""><br class=""></div><div class="">1. Don’t support enums with disparate constructor signatures at all (currently proposed — compiler error for these)</div></div><div class="">2. Allow conformance for all enums, but omit all cases that have associated values (more useful than the proposed solution, but confusing and not ideal)</div><div class="">3. A combination of 1 and 2, where some cases with associated values can potentially have multiple cases included, or none at all (confusing and potentially annoying to work around if it’s not what you want)</div><div class=""><br class=""></div><div class="">Omitting the values and getting back a collection of [Self] would be easy enough anyway: MyEnum.cases.flatMap { $0 as? MyEnum }</div><div class=""><br class=""></div><div class=""><br class=""></div></div><div class="">Here’s what I like about this approach:</div><div class=""><br class=""></div><div class=""><div class="">-&nbsp;This would allow all enums be able to conform, not just ones where every case has the same type.</div></div><div class="">- The array consists of a 1-to-1 mapping regardless of the type of case. This could be very valuable and powerful compared to some of the other ideas that could omit or have multiple entries for a single case.</div><div class="">- As a base implementation, all the other ideas for how to deal with cases with associated values can be implemented on top of this foundation by developers, whereas the other approaches are somewhat more limiting and would not cover the use case I have above.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Downsides I can see to this approach:</div><div class=""><br class=""></div><div class="">- For enums that have disparate constructor signatures, [Any] would have to be the return value of cases, which doesn’t seem ideal because the cases array would always require some kind of manual manipulation to be useful. Would it even be possible for cases to return the [EnumType] for simple enums but [Any] for more complex ones? Is there a better type than [Any] that could be used?</div><div class=""><br class=""></div><div class="">- There isn’t currently a way in the type system to know what case you are working based on the constructor. For instance say two cases both have a constructor of (String), you can’t determine which case you are working on until you call the constructor to instantiate the case. This could be done by looking at the index of the constructor in the cases array, but that is brittle and messy. If there was a way to determine that more dynamically, this would be more powerful and easier to use.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">FYI, some of this content is taken from a post where I wrote about this, but it was just before Christmas and didn’t really get any feedback: <a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151221/004289.html" class="">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151221/004289.html</a></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 20, 2016, at 10:40 PM, Slava Pestov via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" class=""><div dir="ltr" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><div class="" style="font-size: 12.8px;"><div class=""><div dir="ltr" class=""><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; margin-bottom: 0px !important;"><li class="" style="margin-left: 15px;"><p class="" style="margin-top: 16px; margin-bottom: 16px;"><br class="Apple-interchange-newline"><br class="">Support for enum case&nbsp;<strong class="">names</strong>. It would be useful to get case names even for enums which have integer rawValues. This could be part of the existing reflection APIs, or it could take the form of derived implementations of StringLiteralConvertible/CustomStringConvertible.</p><div class=""><br class=""></div></li></ul></div></div></div></div></div></div></div></div></blockquote><div class=""><br class=""></div>I’d love to see reflection move to an opt-in model, with a compiler flag enabling reflection for all types in a module, and a protocol to opt-in conditionally otherwise.</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" class=""><div dir="ltr" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><div class="" style="font-size: 12.8px;"><div class=""><div dir="ltr" class=""><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; margin-bottom: 0px !important;"><li class="" style="margin-left: 15px;"><p class="" style="margin-top: 16px; margin-bottom: 16px;">Support for enums with associated values.</p><div class=""><br class=""></div></li></ul></div></div></div></div></div></div></div></div></blockquote><div class=""><br class=""></div><div class="">This seems tricky to use statically in the general case, as you see below. Do you have any good examples in mind? It seems that case enumeration only really makes sense for types with a finite number of elements, and not when you have associated values.</div><div class=""><br class=""></div><div class="">Perhaps it should only work if the associated values are themselves enums, and they can be enumerated recursively? But even that seems overkill, and something that people should implement themselves if they need it.</div><div class=""><br class=""></div><blockquote type="cite" class=""><div dir="ltr" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><div class="" style="font-size: 12.8px;"><div class=""><div dir="ltr" class=""><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; margin-bottom: 0px !important;"><li class="" style="margin-left: 15px;"><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 0px;"><li class="" style="margin-left: 15px;"><p class="" style="margin-top: 16px; margin-bottom: 16px;">If Swift had anonymous sum types like&nbsp;<code class="" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);">A | B | C</code>, then&nbsp;<code class="" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);">E.cases</code>&nbsp;could vend elements of type&nbsp;<code class="" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);">A-&gt;E | B-&gt;E | C-&gt;E</code>.</p><div class=""><br class=""></div></li></ul></li></ul></div></div></div></div></div></div></div></div></blockquote><div class=""><br class=""></div>As part of write reflection, it would make sense to expose constructor functions [Any -&gt; E?] that perform a dynamic type check, failing with nil.</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Imagine if you could reflect an enum of type T, and get an array of [EnumCase&lt;T&gt;]:</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">enum EnumCase&lt;T&gt; {</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>// constructor makes a value: Payload -&gt; T</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>// projection tests a value, returning payload if its that case, or nil: T -&gt; Payload?</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>// type is the runtime type of the payload</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>case PayloadCase(name: String, constructor: Any -&gt; T, projection: T -&gt; Any?, type: Any.Type)</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>case EmptyCase(name: String, value: T)</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">}</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Then you can get representative values of all cases by mapping over this array, returning the ‘value’ element of an EmptyCase.</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""><blockquote type="cite" class=""><div dir="ltr" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><div class="" style="font-size: 12.8px;"><div class=""><div dir="ltr" class=""><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; margin-bottom: 0px !important;"><li class="" style="margin-left: 15px;"><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 0px;"><li class="" style="margin-left: 15px;"><div class="" style="margin-bottom: 16px;"><pre class="" style="white-space: pre-wrap; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; background-color: rgb(247, 247, 247);"><span class="" style="color: rgb(167, 29, 93);">enum</span> Expr { <span class="" style="color: rgb(167, 29, 93);">case</span> Apply(Expr, Expr), Tuple(Expr, Expr), Literal(<span class="" style="color: rgb(0, 134, 179);">Int</span>) }
<span class="" style="color: rgb(167, 29, 93);">extension</span> Value: CaseEnumerable {}

<span class="" style="color: rgb(150, 152, 150);">// This example is pretty contrived, but illustrates the functionality.</span>
<span class="" style="color: rgb(167, 29, 93);">let</span> fortyTwos <span class="" style="color: rgb(167, 29, 93);">=</span> Expr<span class="" style="color: rgb(167, 29, 93);">.</span>cases<span class="" style="color: rgb(167, 29, 93);">.</span><span class="" style="color: rgb(0, 134, 179);">map</span> {
   <span class="" style="color: rgb(150, 152, 150);">// $0 is of type `Int -&gt; Expr | (Expr, Expr) -&gt; Expr`</span>
   <span class="" style="color: rgb(167, 29, 93);">switch</span> $<span class="" style="color: rgb(0, 134, 179);">0</span> {
   <span class="" style="color: rgb(167, 29, 93);">case</span> <span class="" style="color: rgb(167, 29, 93);">let</span> lit <span class="" style="color: rgb(167, 29, 93);">as</span> <span class="" style="color: rgb(0, 134, 179);">Int</span> <span class="" style="color: rgb(167, 29, 93);">-&gt;</span> Expr:  <span class="" style="color: rgb(150, 152, 150);">// handles .Literal</span>
       <span class="" style="color: rgb(167, 29, 93);">return</span> lit(<span class="" style="color: rgb(0, 134, 179);">42</span>)
   <span class="" style="color: rgb(167, 29, 93);">case</span> <span class="" style="color: rgb(167, 29, 93);">let</span> bin <span class="" style="color: rgb(167, 29, 93);">as</span> (Expr, Expr) <span class="" style="color: rgb(167, 29, 93);">-&gt;</span> Expr:  <span class="" style="color: rgb(150, 152, 150);">// handles .Apply and .Tuple</span>
       <span class="" style="color: rgb(167, 29, 93);">return</span> bin(<span class="" style="color: rgb(167, 29, 93);">.</span>Literal(<span class="" style="color: rgb(0, 134, 179);">42</span>), <span class="" style="color: rgb(167, 29, 93);">.</span>Literal(<span class="" style="color: rgb(0, 134, 179);">42</span>))
   <span class="" style="color: rgb(150, 152, 150);">// all cases are covered</span>
   }
}</pre></div></li></ul></li></ul></div></div></div></div></div></div></div></div></blockquote><div class=""><br class=""></div>I think in this example program, it would make more sense to define these data types:</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">enum BinaryExprKind { cae Apply, Tuple }</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">enum Expr { case Binary(Kind, Expr, Expr), Literal(Int) }</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">You can still enumerate the cases of&nbsp;BinaryExprKind dynamically, but destructuring Expr requires a switch.<br class=""><blockquote type="cite" class=""><div dir="ltr" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><div class="" style="font-size: 12.8px;"><div class=""><div dir="ltr" class=""><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; margin-bottom: 0px !important;"><li class="" style="margin-left: 15px;"><p class="" style="margin-top: 16px; margin-bottom: 16px;">Support for generic enums.</p><ul class="" style="padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 0px;"><li class="" style="margin-left: 15px;"><p class="" style="margin-top: 16px; margin-bottom: 16px;">CaseEnumerable could be conditionally supported depending on the generic argument(s). A great example would be Optional:</p><div class="" style="margin-bottom: 16px;"><pre class="" style="white-space: pre-wrap; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; background-color: rgb(247, 247, 247);"><span class="" style="color: rgb(167, 29, 93);">enum</span> MyEnum: CaseEnumerable {}
<span class="" style="color: rgb(167, 29, 93);">extension</span> <span class="" style="color: rgb(0, 134, 179);">Optional</span>: CaseEnumerable <span class="" style="color: rgb(167, 29, 93);">where</span> Wrapped: CaseEnumerable {}

<span class="" style="color: rgb(150, 152, 150);">// Optional&lt;MyEnum&gt;.cases effectively contains `MyEnum.cases + [.None]`</span></pre></div></li></ul></li></ul></div></div></div></div></div></div></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></blockquote></div><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:swift-evolution@swift.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></body></html>