> On Jun 17, 2017, at 21:12, Ben Cohen via swift-users <swift-users@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 _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users