> 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

Reply via email to