<div dir="ltr"><a href="https://bugs.swift.org/browse/SR-5250">https://bugs.swift.org/browse/SR-5250</a><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jun 18, 2017 at 6:12 AM, Ben Cohen <span dir="ltr">&lt;<a href="mailto:ben_cohen@apple.com" target="_blank">ben_cohen@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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.<br>
<br>
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.<br>
<br>
Except this particular technique is relying on it.<br>
<br>
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.<br>
<div><div class="h5"><br>
&gt; On Jun 16, 2017, at 1:40 PM, Jens Persson via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; // Swift 4, Xcode 9 beta 1, default toolchain<br>
&gt;<br>
&gt; import Foundation<br>
&gt;<br>
&gt; var d1 = [Int : String]()<br>
&gt; d1[1, default: .init()].append(&quot;a&quot;)<br>
&gt; d1[2, default: .init()].append(&quot;b&quot;)<br>
&gt; d1[3, default: .init()].append(&quot;c&quot;)<br>
&gt; d1[1, default: .init()].append(&quot;d&quot;)<br>
&gt; print(d1) // [2: &quot;b&quot;, 3: &quot;c&quot;, 1: &quot;ad&quot;] as expected.<br>
&gt;<br>
&gt; var d2 = [Int : NSMutableString]()<br>
&gt; d2[1, default: .init()].append(&quot;a&quot;)<br>
&gt; d2[2, default: .init()].append(&quot;b&quot;)<br>
&gt; d2[3, default: .init()].append(&quot;c&quot;)<br>
&gt; d2[1, default: .init()].append(&quot;d&quot;)<br>
&gt; print(d2) // [:] but why?<br>
&gt;<br>
&gt; I know that NSMutableString is a reference type and String is a value type and that the default argument is an @autoclosure. I also know that the newly created NSMutableString instance is just released immediately after the append call, without being stored and retained in the Dictionary&#39;s storage.<br>
&gt;<br>
&gt; Is this the intended behavior and if so, please let me better understand how/why.<br>
&gt;<br>
&gt; /Jens<br>
&gt;<br>
</div></div>&gt; ______________________________<wbr>_________________<br>
&gt; swift-users mailing list<br>
&gt; <a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
<br>
</blockquote></div><br></div>