<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>Thanks Shawn.&nbsp;</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">I understand that part. I asked mostly because Nate mentioned that we cannot have a default closure because it would force the use of try even when the default closure does not throw. I do t know if that is a current bug or feature to allow changing the default in the future to a closure that throws:</div><div id="AppleMailSignature"><br><blockquote type="cite"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div class="gmail_msg" style="word-wrap: break-word;"><div class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><font color="#000000" style="background-color: rgba(255, 255, 255, 0);"><a href="https://bugs.swift.org/browse/SR-2979" class="gmail_msg" target="_blank" style="background-color: rgba(255, 255, 255, 0);">https://bugs.swift.org/browse/SR-2979</a></font></div></div></div></blockquote></div></div></div></blockquote></div></blockquote><br>Thanks.&nbsp;</div><div><br>On Apr 6, 2017, at 10:12 PM, Shawn Erickson &lt;<a href="mailto:shawnce@gmail.com">shawnce@gmail.com</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><div>They rethrow which is IMHO perfect for this. If the closure throws then the outer functions throws (e.g. requires try). This allows folks that have a need to throw if they want without forcing it on everyone.</div><div><br><div class="gmail_quote"><div>On Thu, Apr 6, 2017 at 6:53 PM Ricardo Parada via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">How important is it that the closure be allowed to throw when resolving collisions?&nbsp; In my use cases merging dictionaries he resolving of the collisions is always relatively simple.&nbsp; Shouldn’t they be as below maybe?</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><pre style="box-sizing:border-box;font-family:SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(246,248,250);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;color:rgb(36,41,46)" class="gmail_msg">    <span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box">///</span> Creates a new dictionary using the key/value pairs in the given sequence,</span>
<span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"></span>    <span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box">///</span> using a combining closure to determine the value for any duplicate keys.</span>
<span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"></span>    <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">init</span>&lt;<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">S</span>: <span class="m_-4883445260086325981pl-e gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)"><span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Sequence</span></span>&gt;(
        <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">merging</span> <span class="m_-4883445260086325981pl-smi gmail_msg" style="box-sizing:border-box;color:rgb(51,51,51)">keysAndValues</span>: S,
        <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">resolvingCollisionsWith</span> <span class="m_-4883445260086325981pl-smi gmail_msg" style="box-sizing:border-box;color:rgb(51,51,51)">combine</span>: (<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>, <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>) <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">-&gt;</span> <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>
    ) <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">where</span> S.<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Iterator</span>.<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Element</span> <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">==</span> <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Element</span>

    <span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box">///</span> Merges the key/value pairs in the given sequence into the dictionary,</span>
<span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"></span>    <span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box">///</span> using a combining closure to determine the value for any duplicate keys.</span>
<span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"></span>    <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">mutating</span> <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">func</span> <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">merge</span>&lt;<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">S</span>: <span class="m_-4883445260086325981pl-e gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)"><span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Sequence</span></span>&gt;(
        <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">_</span> <span class="m_-4883445260086325981pl-smi gmail_msg" style="box-sizing:border-box;color:rgb(51,51,51)">other</span>: S,
        <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">resolvingCollisionsWith </span><span class="m_-4883445260086325981pl-smi gmail_msg" style="box-sizing:border-box;color:rgb(51,51,51)">combine</span>: (<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>, <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>) <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">-&gt;</span> <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>
    ) <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">where</span> S.<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Iterator</span>.<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Element</span> <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">==</span> <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Element</span></pre><pre style="box-sizing:border-box;font-family:SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(246,248,250);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;color:rgb(36,41,46)" class="gmail_msg"><span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)"><pre style="box-sizing:border-box;font-family:SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;color:rgb(36,41,46)" class="gmail_msg">    <span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box">///</span> Returns a new dictionary created by merging the key/value pairs in the</span>
<span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"></span>    <span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box">///</span> given sequence into the dictionary, using a combining closure to determine</span>
<span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"></span>    <span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box">///</span> the value for any duplicate keys.</span>
<span class="m_-4883445260086325981pl-c gmail_msg" style="box-sizing:border-box;color:rgb(150,152,150)"></span>    <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">func</span> <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">merged</span>&lt;<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">S</span>: <span class="m_-4883445260086325981pl-e gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)"><span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Sequence</span></span>&gt;(
        <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">with</span> <span class="m_-4883445260086325981pl-smi gmail_msg" style="box-sizing:border-box;color:rgb(51,51,51)">other</span>: S,
        <span class="m_-4883445260086325981pl-en gmail_msg" style="box-sizing:border-box;color:rgb(121,93,163)">resolvingCollisionsWith</span> <span class="m_-4883445260086325981pl-smi gmail_msg" style="box-sizing:border-box;color:rgb(51,51,51)">combine</span>: (<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>, <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>) <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">-&gt;</span> <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>
    ) <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">-&gt;</span> [<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Key</span>: <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Value</span>] <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">where</span> S.<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Iterator</span>.<span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Element</span> <span class="m_-4883445260086325981pl-k gmail_msg" style="box-sizing:border-box;color:rgb(167,29,93)">==</span> <span class="m_-4883445260086325981pl-c1 gmail_msg" style="box-sizing:border-box;color:rgb(0,134,179)">Element</span></pre></span></pre><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Apr 6, 2017, at 12:51 PM, Nate Cook via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_-4883445260086325981Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Apr 5, 2017, at 9:43 PM, Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_-4883445260086325981Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Apr 5, 2017, at 5:45 PM, Ben Cohen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>• What is your evaluation of the proposal?<br class="gmail_msg"></div></div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">(As a meta issue, I'm not sure I like the grab-bag review style; I'm finding this proposal a little bit difficult to navigate.)</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><b class="gmail_msg">Sequence-based initializer and merging initializer</b></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Good idea, but I think these two are redundant with each other, and I don't think "merging" is an accurate way to describe what the second one does. (`merging` would suggest to me that it was combining several dictionaries or lists, not combining conflicting elements.) I'd suggest a single initializer along the lines of:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>init&lt;S:&nbsp;Sequence&gt;(_&nbsp;keysAndValues: S, correctingConflictsBy resolveConflict: (Value, Value) throws -&gt; Value = { fatalError("Duplicate values \($0) and \($1)") }) rethrows</div><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">                </span>where&nbsp;S.Iterator.Element&nbsp;==&nbsp;(key:&nbsp;Key, value:&nbsp;Value)</div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Thanks for all your feedback, Brent! One note on this item in particular—if you specify a default argument for a throws/rethrows closure, you have to use "try" at the call site even if the default closure argument doesn't throw. Modules currently don't promise that default closure arguments don't throw, and a default argument could change from non-throwing to throwing in a later version of a library.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">There's a bug tracking the issue here:&nbsp;<a href="https://bugs.swift.org/browse/SR-2979" class="gmail_msg" target="_blank">https://bugs.swift.org/browse/SR-2979</a></div><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><b class="gmail_msg">Merging methods</b></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Good idea, but I'm not a fan of the `mergingValues:` label. I would suggest the same `correctingConflictsBy resolveConflict:` label I suggested for the previous method—possibly including the default value. I also think `merge(_:correctingConflictsBy:)`'s first parameter should be labeled `with`, just as the `merged` variant is.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I wonder if we might also want a method that copies the Dictionary, but with a single key added/removed/changed:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>func withValue(_ value: Value?, forKey key: Key) -&gt; [Key: Value]</div></div></div></div></blockquote><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><br class="gmail_msg"></blockquote><blockquote type="cite" class="gmail_msg"><b class="gmail_msg">Key-based subscript with default value</b></blockquote></div><blockquote type="cite" class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I like the functionality, but not way this proposal does it. I don't like having the default value be a labeled parameter to the subscript, because it isn't used to locate the value. However, I can't come up with a better syntax without adding language features. What I'd like to do is make it possible to assign through `??`:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>frequencies[c] ?? 0&nbsp;+=&nbsp;1</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">But that would require either that we support `inout` functions, or that `??` become magic syntax instead of a standard library feature. The former is not coming in Swift 4 and the latter is less than ideal.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Still, if we would rather have that syntax and we think we'll soon have the language improvements needed to pull it off, I'd suggest rejecting this portion of the proposal.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><b class="gmail_msg">Dictionary-specific map and filter</b></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I am +114 on this. I say that because I have received 114 upvotes on my Stack Overflow answer explaining how to write a `Dictionary.map` method: &lt;<a href="http://stackoverflow.com/questions/24116271/whats-the-cleanest-way-of-applying-map-to-a-dictionary-in-swift/24219069#24219069" class="gmail_msg" target="_blank">http://stackoverflow.com/questions/24116271/whats-the-cleanest-way-of-applying-map-to-a-dictionary-in-swift/24219069#24219069</a>&gt;</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I agree with the decision not to pass keys to the closures in these methods; that keeps them simple and focused, and ensures they stay parallel with ordinary `map` and `filter`. I also agree with the decision to not build in a form of `map` which allows key remapping; you can always do that with the sequence-based initializer, which would let you add conflict-handling logic more elegantly than a key-value `map` could.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><b class="gmail_msg">Visible dictionary capacity</b></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I doubt I'll ever use the `capacity` property, but I'm not opposed to it. Adding a `reserveCapacity(_:)` method is a good idea.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><b class="gmail_msg">A&nbsp;grouped(by:)&nbsp;method for sequences</b></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Yes, please.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><b class="gmail_msg">Apply relevant changes to&nbsp;Set</b></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">These make sense. (I considered suggesting the `filter` method be called `intersection(where:)`, but on second thought, I don't think that conveys the actual use cases for the method very well.)</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I wonder if we might want to conform `Dictionary` to `SetAlgebra`. They have compatible semantics, and I've occasionally wanted to use them in the same places. On the other hand, some of the methods might form attractive nuisances; perhaps I should just write a SetAlgebra-conforming view when I want to do that.</div></div></div></blockquote><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><br class="gmail_msg"></blockquote></div><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><b class="gmail_msg">General notes</b></div><div class="gmail_msg"><b class="gmail_msg"><br class="gmail_msg"></b></div><div class="gmail_msg">If SE-0161 is accepted, we may want to support key path variants of some of these APIs (like `grouped(by:)`, `map(_:)`, and `filter(_:)`). On the other hand, we may want to defer that so we can consider that issue holistically, including with existing Collection APIs.</div><div class="gmail_msg"><br class="gmail_msg"></div><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>• Is the problem being addressed significant enough to warrant a change to Swift?<br class="gmail_msg"></div></div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Yes. These are all common needs; when working with dictionaries, I find myself writing `for` loops with `var`s far more often than I'd like.</div><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>• Does this proposal fit well with the feel and direction of Swift?<br class="gmail_msg"></div></div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Yes, these are all pretty straightforward additions.</div><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>• If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?<br class="gmail_msg"></div></div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Ruby's `Hash` has many of these features and I appreciate them there; `NSDictionary` does not and it suffers for it. Perl hashes have a flattening behavior that tends to be amenable to editing them in various ways, but that's not really suitable for Swift.</div><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><span class="m_-4883445260086325981Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>• How much effort did you put into your review? A glance, a quick reading, or an in-depth study?<br class="gmail_msg"></div></div></div></div></div></blockquote></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Quick reading.</div><br class="gmail_msg"><div class="gmail_msg"><span class="m_-4883445260086325981Apple-style-span gmail_msg" style="border-collapse:separate;font-variant-ligatures:normal;font-variant-east-asian:normal;line-height:normal;border-spacing:0px"><div class="gmail_msg"><div style="font-size:12px" class="gmail_msg">--&nbsp;</div><div style="font-size:12px" class="gmail_msg">Brent Royal-Gordon</div><div style="font-size:12px" class="gmail_msg">Architechies</div></div></span></div><br class="gmail_msg"></div>_______________________________________________<br class="gmail_msg">swift-evolution mailing list<br class="gmail_msg"><a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg"></div></blockquote></div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important" class="gmail_msg">_______________________________________________</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important" class="gmail_msg">swift-evolution mailing list</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg"><a href="mailto:swift-evolution@swift.org" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class="gmail_msg"></div></div>_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div></div>
</div></blockquote></body></html>