<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class="">I am definitely +1 for adding the initializer in any case. &nbsp;</div><div class=""><br class=""></div><div class="">I would like to see it (based on Nate’s suggestion) have a “merge" parameter which takes a closure of (Key, Value, Value)throws-&gt;Value, which would be called to choose a value whenever a repeated key is encountered. &nbsp;That parameter should have a default value which just traps. &nbsp;That way the default behavior is to trap when a key is repeated, but it can still be overridden with a more appropriate behavior for the situation (e.g. keeping the first value, keeping the last, averaging them, etc…)</div><div class=""><br class=""></div><div class="">That said, I would still also like to see the functionality of mapValues (whatever it ends up being called) in the standard library. &nbsp;It easily applies to 80-90% of my use cases, and allowing re-mapping of keys adds a lot of complexity which must be carefully considered (there is a lot more which can go wrong). &nbsp;As swift is a practical language, it would be nice to have a quick and foolproof way to do this common task.</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Jon</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><pre style="white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="">on Tue Apr 12 2016, Jonathan Hull &lt;<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">swift-evolution at swift.org</a>&gt; wrote:

&gt;<i class=""> I would really like to see something like the following added to the standard
</i>&gt;<i class=""> library:
</i>&gt;<i class="">
</i>&gt;<i class=""> extension Dictionary {
</i>&gt;<i class="">
</i>&gt;<i class=""> func mapValues&lt;U&gt;(transform:(Key,Value)-&gt;U)-&gt;[Key:U] {
</i>&gt;<i class=""> var output:[Key:U] = [:]
</i>&gt;<i class=""> for (k,v) in self {
</i>&gt;<i class=""> output[k] = transform(k,v)
</i>&gt;<i class=""> }
</i>&gt;<i class=""> return output
</i>&gt;<i class=""> }
</i>&gt;<i class="">
</i>&gt;<i class=""> }
</i>&gt;<i class="">
</i>&gt;<i class=""> It comes up enough that I have had to add it to pretty much every one of my
</i>&gt;<i class=""> projects. I also don’t feel comfortable adding it to my frameworks, since I
</i>&gt;<i class=""> figure a lot of people are also adding something like this to their projects,
</i>&gt;<i class=""> and I don’t want to cause a conflict with their version. Prime candidate for the
</i>&gt;<i class=""> standard library.
</i>&gt;<i class="">
</i>&gt;<i class=""> I like calling it ‘mapValues' as opposed to providing an override for map, since
</i>&gt;<i class=""> it makes the specific behavior more clear. I would expect ‘map' to possibly map
</i>&gt;<i class=""> the keys as well (though there are issues where the new keys overlap). I suppose
</i>&gt;<i class=""> you could just have a bunch of overrides for map if the compiler becomes good
</i>&gt;<i class=""> enough at differentiating return types: (Value)-&gt;(Value), (Key,Value)-&gt;Value,
</i>&gt;<i class=""> (Key, Value)-&gt;(Key,Value)
</i>
I agree that we need a way to do this, and was surprised when what I
tried didn't work.  This should work:

  Dictionary(d.lazy.map { (k, v) in (k, transform(v)) })

We should have a proposal that makes the constructor work* if we don't
already have one.

I'm inclined against building specialized variants of basic algorithms
into particular collections, though.  Could be talked out of it if the
use-case is strong enough.</pre></blockquote><div class=""><br class=""></div></div></body></html>