<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 11, 2017, at 10:25 PM, David Hart 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-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class=""><br class="Apple-interchange-newline">On 11 Jun 2017, at 02:49, Ben Cohen &lt;<a href="mailto:ben_cohen@apple.com" class="">ben_cohen@apple.com</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jun 8, 2017, at 10:32 AM, David Hart 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 class="">Hello,<br class=""><br class="">When working with Strings which are known to be ASCII, I tend to use the UTF16View for the performance of random access. I would also like to have the convenience of indexing with Int:<br class=""><br class="">let barcode = "M1XXXXXXXXX/CLEMENT &nbsp;&nbsp;EELT9QBQGVAAMSEZY1353 244 21D 531 &nbsp;10A1311446838”<br class="">let name = barcode.utf16[2..&lt;22]<br class="">let pnrCode = barcode.utf16[23..&lt;30]<br class="">let seatNo = barcode.utf16[47..&lt;51]<br class="">let fromCity = barcode.utf16[30..&lt;33]<br class="">let toCity = barcode.utf16[33..&lt;36]<br class="">let carrier = barcode.utf16[36..&lt;39]<br class="">let flightNumber = barcode.utf16[39..&lt;44]<br class="">let day = barcode.utf16[44..&lt;47]<br class=""><br class="">I define my own subscript in an extension to UTF16View but I think this should go in the Standard Library.<br class="">Any thoughts?<br class=""><br class="">David.<br class="">_______________________________________________<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=""></div></div></blockquote></div><div class=""><br class=""></div>Hi David,<div class=""><br class=""></div><div class=""><div class="">My view is positional shredding of strings<span class="Apple-converted-space">&nbsp;</span><i class="">is</i><span class="Apple-converted-space">&nbsp;</span>enough of a use case that we ought to think about handling it better. I don’t think having to convert the string into an Array of Character, or bytes, or use Data, should be necessary, since this implies losing the stringiness of the slices you are creating, which is an inconvenience for many use cases. Strings-as-data is a thing we should support, and support well.</div><div class=""><br class=""></div><div class="">But I also don’t think giving String or its views integer indices is the right way to go either, incorrectly implying as it does random access&nbsp;</div><div class=""><br class=""></div><div class="">(or, even if we did end up making utf16 permanently random-access, encouraging people towards using utf16 to support this use case when often they’d be better served sticking with characters).</div><div class=""><br class=""></div><div class="">There’s a few things to note about the example you give:</div><div class="">1) Do you really want utf16 view slices for your variable types? Maybe in this case you do, but I would guess a lot of the time what is desired would be a (sub)string.</div></div></div></blockquote><div class=""><br class=""></div><div class="">Not really. I would be quite happy with Substring. The variable type is just the consequence of my choice of the UTF16 view.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><div class="">2) Do you really want to hard-code integer literals into your code? Maybe for a quick shell script use case, but for anything more this seems like an anti-pattern that integer indices encourage.</div></div></div></blockquote><div class=""><br class=""></div><div class="">I agree. I took the code out of a project of mine and simplified it. I have the Int ranges defined as named constants.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><div class="">3) Are you likely to actually want validation at each step – that the string was long enough, that the string data was valid at that point?</div></div></div></blockquote><div class=""><br class=""></div><div class="">No. I pre-validate the string and it's length beforehand.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><div class="">4) This case doesn’t seem to need random access particularly, so much as the (questionable? see above) convenience of integer indexing. Although reordered in the example, it seems like the code could be written to progressively traverse the string from left to right to get the fields. Unless the plan is to repeatedly access some fields over and over. But I’m not sure we’d want to put affordances into the std lib to encourage accessing stringly typed data...</div></div></div></blockquote><div class=""><br class=""></div><div class="">Indeed. I initially rewrote the code to traverse the string from left to write, advancing indices by deltas. But (1) it made the code less readable, (2) further removed from the barcode spec which is defined in terms of offsets, and (3) more brittle - editing deltas forces chain modifications:</div><div class=""><br class=""></div><div class="">let nameStart = barcode.index(name.startIndex, offsetBy: 2)</div><div class="">let nameEnd = barcode.index(nameStart, offsetBy: 20)</div><div class="">let name = barcode[nameStart..&lt;nameEnd]</div><div class=""><br class=""></div><div class="">let pnrCodeStart = barcode.index(nameEnd, offsetBy: 1)</div><div class="">let pnrCodeEnd = barcode.index(pnrCodeStart, offsetBy: 7)</div><div class="">let pnrCode = barcode[pnrCodeStart..&lt;pnrCodeEnd]</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><div class="">So the question is, what affordances should we put into the standard library, or maybe other libraries, to help with these use cases? This is a big design space to explore, and at least some ideas ought to feed into our ongoing improvements to String for future releases.</div><div class=""><br class=""></div><div class="">For example:</div><div class=""><br class=""></div><div class="">Now that we have Substring, it opens up the ability to efficiently consume from the front (since it’s just adjusting the substring range):</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">extension</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">Collection</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">where</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">Self</span><span class="Apple-converted-space">&nbsp;</span>== SubSequence {</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 143, 0); background-color: rgb(255, 255, 255);"><span class="" style="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span>// or some better name...</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">mutating</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">func</span>&nbsp;<span class="" style="color: rgb(52, 149, 175);">removeFirst</span>(<span class="" style="color: rgb(4, 51, 255);">_</span><span class="Apple-converted-space">&nbsp;</span>n:<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">IndexDistance</span>) -&gt;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">SubSequence</span>? {</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">guard</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">let</span><span class="Apple-converted-space">&nbsp;</span>i =<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">index</span>(<span class="" style="color: rgb(52, 149, 175);">startIndex</span>, offsetBy: n, limitedBy:<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">endIndex</span>)</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">else</span><span class="Apple-converted-space">&nbsp;</span>{<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">return</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">nil</span><span class="Apple-converted-space">&nbsp;</span>}</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 13px;" class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br class="webkit-block-placeholder"></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">defer</span><span class="Apple-converted-space">&nbsp;</span>{<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">self</span><span class="Apple-converted-space">&nbsp;</span>=<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">self</span>[i...] }</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">return</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">self</span>[..&lt;i]</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp; }</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">}</div></div><div class=""><br class=""></div><div class="">Once you have this, you could use it to write the example code, along with some error checking (or you could use ! if you were completely certain of the integrity of your data)</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 143, 0); background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">var</span><span class="" style=""><span class="Apple-converted-space">&nbsp;</span>s =<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="color: rgb(52, 149, 175);">barcode</span><span class="" style="">[...]<span class="Apple-converted-space">&nbsp;</span></span>// make a substring for efficient consumption</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 143, 0); background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">_</span><span class="" style=""><span class="Apple-converted-space">&nbsp;</span>=<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="color: rgb(52, 149, 175);">s</span><span class="" style="">.</span><span class="" style="color: rgb(52, 149, 175);">consume</span><span class="" style="">(2) &nbsp; &nbsp;&nbsp;</span>// drop initial prefix</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">guard</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">let</span><span class="Apple-converted-space">&nbsp;</span>name =<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">s</span>.<span class="" style="color: rgb(52, 149, 175);">removeFirst</span>(20)?.trim&nbsp;<span class="" style="color: rgb(4, 51, 255);">else</span><span class="Apple-converted-space">&nbsp;</span>{<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">fatalError</span>(<span class="" style="color: rgb(180, 38, 26);">"Failed to read name"</span>) }</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">guard</span><span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">let</span><span class="Apple-converted-space">&nbsp;</span>pnrCode =&nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">s</span>.<span class="" style="color: rgb(52, 149, 175);">removeFirst</span>(6).map(<span class="" style="text-decoration: underline;">P</span>NRCode.<span class="" style="color: rgb(4, 51, 255);">init</span>)<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">else</span><span class="Apple-converted-space">&nbsp;</span>{<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">fatalError</span>(<span class="" style="color: rgb(180, 38, 26);">"Failed to read pnrCode"</span>) }</div></div></div></div></blockquote><div class=""><br class=""></div><div class="">Definitely interesting! But it has some of the same issues as my code above.</div><br class=""></div></div></blockquote><div><br class=""></div><div>This has one less issue than your code above: because it works on Characters you’ll get proper grapheme breaking. Even for ASCII, the provided code is safer as grapheme breaking is almost-but-not-quite-trivial for ASCII. To have code units be the same as Characters, you’ll need to validate that it is both ASCII *and* does not contain a CR-LF sequence inside, as CR-LF is a single grapheme.</div><div><br class=""></div><div>This is not intuitive right away and is a good example of the kinds of traps that can arise when working directly on code units rather than Character, even if all ASCII. This can cause seemingly well tested code to blow up in production.</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" class=""><div class=""><div class=""><div class="">Or you could build on the above to create a function that could shred a string into a dictionary of fields… (probably a bit domain-specific for the std lib at this point)</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(52, 149, 175); background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">extension</span><span class="" style=""><span class="Apple-converted-space">&nbsp;</span></span>Collection<span class="" style=""><span class="Apple-converted-space">&nbsp;</span>{</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(52, 149, 175); background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(0, 143, 0);">&nbsp; &nbsp; // could choose to handle or fail on gaps, out-of-order ranges, overlapping ranges etc</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">func</span><span class="Apple-converted-space">&nbsp;</span>fields&lt;P:<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">Collection</span>&gt;(at positions:<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">P</span>) -&gt; [<span class="" style="color: rgb(52, 149, 175);">String</span>:SubSequence]?&nbsp;<span class="" style="color: rgb(0, 143, 0);">// or throw an error with a field name</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(52, 149, 175); background-color: rgb(255, 255, 255);"><span class="" style="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="color: rgb(4, 51, 255);">where</span><span class="" style=""><span class="Apple-converted-space">&nbsp;</span></span>P<span class="" style="">.</span>Element<span class="" style=""><span class="Apple-converted-space">&nbsp;</span>== (key:<span class="Apple-converted-space">&nbsp;</span></span>String<span class="" style="">, value:<span class="Apple-converted-space">&nbsp;</span></span>CountableRange<span class="" style="">&lt;</span>IndexDistance<span class="" style="">&gt;)</span></div></div><div class="">}</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">let</span><span class="Apple-converted-space">&nbsp;</span>barcodeSchema:<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">DictionaryLiteral</span><span class="Apple-converted-space">&nbsp;</span>= [</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(180, 38, 26);">"name"</span>: 2..&lt;22,</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(180, 38, 26);">"pnrCode"</span>: 23..&lt;30,</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(180, 38, 26);">"fromCity"</span>: 30..&lt;33,</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(180, 38, 26);">"toCity"</span>: 33..&lt;36,</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(180, 38, 26);">"carrier"</span>: 36..&lt;39,</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(180, 38, 26); background-color: rgb(255, 255, 255);"><span class="" style="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span>"flightNumber"<span class="" style="">: 39..&lt;44,</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(180, 38, 26);">"day"</span>: 45..&lt;47,</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span><span class="" style="color: rgb(180, 38, 26);">"seatNo"</span>: 47..&lt;51,</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);">]</div><div class="" style="margin: 0px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;"><br class=""></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(52, 149, 175); background-color: rgb(255, 255, 255);"><span class="" style="color: rgb(4, 51, 255);">let</span><span class="" style=""><span class="Apple-converted-space">&nbsp;</span>fields =<span class="Apple-converted-space">&nbsp;</span></span>barcode<span class="" style="">.</span>fields<span class="" style="">(at:<span class="Apple-converted-space">&nbsp;</span></span>barcodeSchema<span class="" style="">)!</span></div></div></div></div></blockquote><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">This brings us back to more natural (for this algorithm) Int ranges, but it does require writing the extra extension. And if that's the case, it's easier to just write a string Int range subscript extension.</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; 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-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">What I was hoping the Standard Library would provide an opt-in, slightly less safe but more convenient, pragmatic solution. </div></div></blockquote><div><br class=""></div><div>Could you elaborate on what you mean by “less safe”?</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">In a similar way, the language lets us use the unwrapping operator to unwrap an optional we know to be non-nil. It's not as safe as optional binding, but it makes the code more readable for cases where we know more than the type system can provide. I don't know if I'm making sense.</div></div></blockquote><div><br class=""></div><div>In the case of unwrapping, the safety given up is clear and the semantics are very obvious. For anything involving Unicode, correctness is non-obvious and corner cases can be treacherous.</div><br class=""><blockquote type="cite" class=""><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; 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-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; 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-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; 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-caps: 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-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; 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-caps: 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-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></body></html>