[swift-users] Intended behavior or bug in Dictionary's new subscript(_:default:)?

David Sweeris davesweeris at mac.com
Sun Jun 18 22:07:47 CDT 2017

> On Jun 17, 2017, at 21:12, Ben Cohen via swift-users <swift-users at swift.org> wrote:
> In order for this defaulting subscript technique to work as intended, the subscript { get } needs to be called, then the mutation happens, then the subscript { set } writes the mutated value back, including adding it for the first time it the default was needed.
> Reference types, not being value types, skip the write-back part, because they shouldn’t need writing back – they should just get amended in place, because they’re reference types. 
> Except this particular technique is relying on it.
> This is probably worth a bug report, though I’m not sure if there’s an easy fix. The alternative is that Dictionary.subscript(_: default:) be made a mutating get that sets the default if not present, even without the set. There’s downsides to this though: you would no longer be able to use this defaulting subscript with immutable dictionaries, and getting a default value would add it which might be very unexpected.

We could say "extension Dictionary where Value: class", but that'll only fix it when the compiler knows `Value` has reference semantics (and lead to even more confusion when used in generic functions without the "T: class" part).

Could we check if `Value: class` within the existing setter? Or if that's what we already do to skip the write-back, skip the skipping when one of the values is nil?

- Dave Sweeris

More information about the swift-users mailing list