<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><br><br><div id="AppleMailSignature">Nate</div><div><br>On Jan 9, 2018, at 12:12 AM, Chris Lattner via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 8, 2018, at 4:29 PM, Ben Cohen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><div class=""><div class="">There exists in the standard library a type `DictionaryLiteral` that deserves naming re-consideration before we declare ABI Stability, because it’s confusingly misnamed, being neither a Dictionary (it doesn’t provide key-based lookup of values) nor a Literal. <br class=""><br class="">Instead, it’s just an immutable collection of key-value pairs you can create _from_ a literal.<br class=""></div></div></blockquote><div><br class=""></div><div>Wow. &nbsp;This is really gross, I didn’t know it existed :-)</div><div><br class=""></div><div>Random question for you. &nbsp;DictionaryLiteral has this doc comment:</div><div><br class=""></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><div>///&nbsp;You initialize a `DictionaryLiteral` instance using a Swift dictionary</div></div><div><div>///&nbsp;literal. Besides maintaining the order of the original dictionary literal,</div></div><div><div>///&nbsp;`DictionaryLiteral` also allows duplicates keys. For example:</div></div></blockquote><div><div><br class=""></div><div>why is maintaining duplicate keys a feature?</div><div><br class=""></div><div><br class=""></div><div>It also has this one:</div><div><br class=""></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><div>///&nbsp;Some operations that are efficient on a dictionary are slower when using</div></div><div><div>///&nbsp;`DictionaryLiteral`. In particular, to find the value matching a key, you</div></div><div><div>///&nbsp;must search through every element of the collection. The call to</div></div><div><div>///&nbsp;`index(where:)` in the following example must traverse the whole</div></div><div><div>///&nbsp;collection to find the element that matches the predicate:</div></div></blockquote><div><div><br class=""></div><div>Since it is immutable, why not sort the keys in the initializer, allowing an efficient binary search to look up values?</div><div><br class=""></div><div><br class=""></div><blockquote type="cite" class=""><div class=""><div class="">I’m canvassing for opinions on what it ought to be called. &nbsp;Some suggestions so far:<br class=""><br class=""> - `AssociationCollection`: Following the term of art from some other languages. Slightly obscure-sounding to developers not already familiar. Also “association” and “associative” are confusingly similar, which brings back the is-this-a-dictionary problem.<br class=""> - `KeyValueCollection`: Problematic because key-value comes up in a totally different context in Cocoa.<br class=""> - `PairCollection`: “Pair” is kinda nondescript.<br class=""> - Do nothing. It’s not so bad.<br class=""><br class="">The old name can live on indefinitely via a typealias (which has no ABI consequences, so could be retired at a later date once everyone has had plenty of time to address the deprecation warnings). Removing it as not carrying its weight (and instead using `[(Key,Value)]`, which is basically what it’s a wrapper for) is probably off the table for source stability reasons.<br class=""></div></div></blockquote></div><br class=""><div class="">I’m not familiar with this type at all, so I apologize for the dumb question but… why was this added in the first place? &nbsp;If it is the wrong thing, why not just deprecate it in Swift 5 and remove it in a future release? &nbsp;That avoids it being an ABI concern, because we could make it be force inlined into any client code.</div></div></blockquote><div><br></div><div>According to now-gone doc comments, it's intended to be used when providing the children for a custom mirror (that's the only API I know of that uses the type). The order of elements there is important, but given how scarcely used the type is, an array of tuples might be a reasonable (though source-breaking) substitute.&nbsp;</div><br><blockquote type="cite"><div><div class="">Finally, is anyone actually using this type?</div></div></blockquote><div><br></div><div>In the standard library, we have this Mirror initializer:&nbsp;<a href="https://developer.apple.com/documentation/swift/mirror/1540408-init">https://developer.apple.com/documentation/swift/mirror/1540408-init</a>. If anyone is customizing their type's mirror, it's a good bet that they're calling that init and passing a literal that would break if the argument changed to an array. The translation should be mechanical, so maybe it could be a migrator fix? (I don't know enough about how that works to know.)</div><br><blockquote type="cite"><div><div class=""><br class=""></div><div class="">-Chris</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></body></html>