<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jan 10, 2018, at 12:44 PM, Karl Wagner <<a href="mailto:razielim@gmail.com" class="">razielim@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On 10. Jan 2018, at 17:22, Paul Cantrell via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class="">What is your evaluation of the proposal?<br class=""></blockquote><br class=""></div><div class="">+1. Yes please. Long overdue.</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class="">Is the problem being addressed significant enough to warrant a change to Swift?<br class=""></blockquote><div class=""><br class=""></div>It’s a long-standing sore thumb. The proposal’s evidence of community demand fits my own experience: I’ve wanted this on multiple occasions.<br class=""><br class=""></div><div class=""><blockquote type="cite" class="">Does this proposal fit well with the feel and direction of Swift?<br class=""></blockquote><br class=""></div><div class="">Yes, and in particular, on the name bikeshedding:</div><div class=""><br class=""></div><div class="">I favor property names <b class="">with the “all” prefix</b>, whether allValues or allCases. Looking over my own code, I’ve almost always used the word “all” for this when I had to hand-roll it — and either allValues or allCases make reasonable sense in my code when I substitute them.</div><div class=""><br class=""></div><div class="">Whichever protocol name we choose, the property name should be consistent:</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>ValueEnumerable → allValues</div><div class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>CaseEnumerable → allCases</div><div class=""><br class=""></div><div class=""></div><div class=""><b class="">Either ValueEnumerable or CaseEnumerable would be a fine name.</b> Contra Chris, I slightly prefer ValueEnumerable, because it extends to situations where we still want to enumerate a fixed set of possibilities which don’t strictly correspond to enum cases but still have that sort of flavor. For example, one might want:</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #323e7d" class="">enum</span> SideOfBody</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> {</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #323e7d" class="">case</span> left</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #323e7d" class="">case</span> right</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Helvetica; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(88, 126, 168); background-color: rgb(255, 255, 255);" class=""><span style="" class=""> </span><span style="color: #323e7d" class="">enum</span><span style="" class=""> Limb: </span>ValueEnumerable</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> {</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #323e7d" class="">case</span> arm(<span style="color: #587ea8" class="">SideOfBody</span>)</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #323e7d" class="">case</span> leg(<span style="color: #587ea8" class="">SideOfBody</span>)</div><div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Helvetica; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #323e7d" class="">static</span> <span style="color: #323e7d" class="">let</span> allValues =</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> [</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #587ea8" class="">arm</span>(.<span style="color: #587ea8" class="">left</span>),</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #587ea8" class="">arm</span>(.<span style="color: #587ea8" class="">right</span>),</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #587ea8" class="">leg</span>(.<span style="color: #587ea8" class="">left</span>),</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: #587ea8" class="">leg</span>(.<span style="color: #587ea8" class="">right</span>)</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ]</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div></div><div class=""><br class=""></div><div class="">To my eyes, this code reads better than it would with CaseEnumerable / allCases.</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class="">If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?<br class=""></blockquote><br class=""></div><div class="">Java’s enums had this from the beginning, and Josh Bloch’s design for that feature has always worked nicely. Java’s design is slightly different: `Foo.values()` returns Foo[]. However, Swift doesn’t need to follow either that name or type choice: (1) Java doesn’t use the term “case” as Swift does, (2) the “all” prefix better fits Swift’s API guidelines IMO, and (3) using a concrete array type has as opposed to Collection has different implications in Java than it does Swift.</div><div class=""><br class=""></div><div class="">I _do_ agree that the proposal should consider <b class="">constraining the Collection to be Int-indexed</b>. Why should it ever be otherwise? What’s the motivation for leaving that open?</div></div></div></blockquote></div><div class=""><br class=""></div><div class="">I don’t agree that the Collection should be Int-indexed. Source-order is not a very strong guarantee IMO, and it wouldn’t be good if people started writing things like "MyEnum.allValues[3]” to reference a specific case.</div></div></div></blockquote><div><br class=""></div><div>You do make a good point about the hidden brittleness of MyEnum.allValues[3].</div><div><br class=""></div><div>Direct indexing of collections using arbitrary hard-coded int indexes is a way to introduce brittleness in many other existing contexts, and I’d say developers already know that it has a bad smell (or are making other far larger mistakes as well). However, using int indices for serialization seems a pitfall that would catch many people. Is there a way to make transient use of ints convenient (as in the proposal’s table view example) but persistent int values inconvenient? No.</div><div><br class=""></div><div>There are clearly enums where source ordering is intentional and significant, and others where the enum is inherently unordered. An alternative would be two protocols, one where allValues is a Set and one where it is an Array, or something along those lines. That feels like overkill to me, however.</div><div><br class=""></div><div>Perhaps the proposal as it stands is the best compromise: everything is ordered, even if the ordering is not stable between versions, but int indexing is inconvenient enough to turn away the more careless among us.</div><div><br class=""></div><div>Cheers, P</div><div><br class=""></div><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div><div class="">If you know the specific case you are looking for, just write it directly. If you found an interesting case while iterating allValues, remember its (opaque) index and come back to it later.</div><div class=""><br class=""></div><div class="">I’m not a fan of Int-indexes in general. It’s practical to allow it for Array, but in general, for generic Collections, I think it implies an awful lot of knowledge about the Collection’s contents.</div><div class=""><br class=""></div><div class="">- Karl</div></div></div></blockquote></div><br class=""></body></html>