[swift-evolution] Dictionary Enhancements

Ben Cohen ben_cohen at apple.com
Sun Feb 19 17:08:46 CST 2017

> On Feb 17, 2017, at 11:20 PM, David Waite <david at alkaline-solutions.com> wrote:
>> On Feb 16, 2017, at 5:26 PM, Ben Cohen via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> Hi swift-evolution,
>> Following up on Ted’s post regarding the opening up of stage 2, I’m starting a thread to discuss improvements to the Dictionary type.
>> Here is a list of commonly requested changes/enhancements to Dictionary, all of which would probably be appropriate to put together into a single evolution proposal:
> <snip>
>> Add a defaulting subscript get (e.g. counts[key, default: 0] += 1 or grouped(key, default:[]].append(value)).
> Interesting, most of my scenarios aren’t one line subscript mutations like this, so I have been happy with counts[key] ?? 0, grouped(key) ?? [], etc.

As well as a readability/discoverability benefit, there’s also a performance benefit: d[key] = (d[key] ?? []) + [value] is a linear-time operation, whereas d[key, default: []].append(value) should be constant time (there is some work needed on dictionary internals for this to work but the API ought to enable it once that’s done).

>> Add capacity property and reserveCapacity() method.
> would CoW copies also have the same reserved capacity?

Yes, it would mirror arrays, which behave like this. Note dictionaries already have this characteristic – they just don’t expose their capacity or allow you to preemptively expand it.

Any other behavior would be tricky. Until its mutated, a CoW copy is a literal copy, so must share the original’s capacity. Once the mutation forces a buffer copy, it would be pretty odd for that capacity to suddenly shrink.

> One way I could hypothetically copy around dictionaries that are using significantly more memory than I suspected,the other way algorithms would be quite confusing as an assignment to a variable might cause the capacity to revert.
> In terms of additional features, I have needed to group by value before, e.g. turn from K->V to V -> [K], which isn’t a simple reduce statement.

If there is a group-by operation from sequences, this ought to be composable from that given dictionaries are (Key,Value) sequences.

> -DW

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170219/03629441/attachment.html>

More information about the swift-evolution mailing list