on Thu Oct 27 2016, Rick Mann <rmann-AT-latencyzero.com> wrote:

>> On Oct 26, 2016, at 22:23 , Dave Abrahams via swift-users 
>> <swift-users@swift.org> wrote:
>> 
>> 
>> on Wed Oct 26 2016, Rick Mann <swift-users-AT-swift.org> wrote:
>> 
>
>>> It seems fairly natural to want to do this:
>>> 
>>> let bigDictionary = ...
>>> let smallerDictionary = bigDictionary.filter { key, value in <some test 
>>> returning Bool> }
>> 
>>> Similarly, it seems natural to want to map this way.
>> 
>> It's reasonable for filter, but maybe not for map.  Map follows certain
>> laws, and one of them is that you get the same number of elements out as
>> you put in.  But you can easily map all keys to the same key, and the
>> law would be violated.
>
> Sure map would produce a dictionary of the same number of entries. I
> didn't mean to imply map would also filter. 

I think you're missing my point.  What result do you expect from

  {1:2, 3:4}.map { _ in (1, 1) }

? How many elements does it have?  Note that you can't have the same key
twice in a Dictionary.

> But I'm basically transforming a JSON dictionary into a new version of
> that dictionary with fewer elements. I'd like to first filter it, then
> map it, and have the result be a dictionary.

What we need are Dictionary initializers that operate on Sequences, per
https://github.com/apple/swift-evolution/blob/master/proposals/0100-add-sequence-based-init-and-merge-to-dictionary.md

    Dictionary(merging: d.lazy.filter {... }.map {...})

That would get you the result you're looking for in a principled way,
without creating an intermediate Array.

-- 
-Dave
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to