flatMap was designed to work this way. How I rationalize it is that flatMap 
“extracts” the value from an array’s elements and expands it. For an Array, 
this is just taking out the individual Elements, but for an Optional, which a 
“wrapper” around one value, it just takes this value out. Optionals with no 
value (the .none case, or nil as it’s more commonly known) have nothing to 
contribute and thus are filtered out.

Saagar Jha

P.S. You can call flatMap without a closure: deep.flatMap().flatMap()

> On Feb 13, 2017, at 4:31 PM, Maxim Veksler via swift-users 
> <swift-users@swift.org> wrote:
> 
> Hi everyone,
> 
> I've discovered today that Swift will actually choose 2 very differently 
> behaving types of flatMap implementation based on the input signature. 
> 
> For a Sequence of options it will call a flatMap that filters out nil's. For 
> a Sequence of Sequence's it will call a flattening function, without 
> filtering.
> 
> Leading to code that (IMHO) reads very not inconsistency, and unexpected. 
> Sometime even looking a bit funny such as collection.flatMap.flatMap:
> 
>   5> let deep = [["1989", nil], [nil, "Red"], [nil, nil]]
> deep: [[String?]] = 3 values {
>   [0] = 2 values {
>     [0] = "1989"
>     [1] = nil
>   }
>   [1] = 2 values {
>     [0] = nil
>     [1] = "Red"
>   }
>   [2] = 2 values {
>     [0] = nil
>     [1] = nil
>   }
> }
>   6> deep.flatMap { $0 }
> $R1: [String?] = 6 values {
>   [0] = "1989"
>   [1] = nil
>   [2] = nil
>   [3] = "Red"
>   [4] = nil
>   [5] = nil
> }
>   7> deep.flatMap { $0 }.flatMap { $0 }
> $R2: [String] = 2 values {
>   [0] = "1989"
>   [1] = "Red"
> }
> I wonder why it was implemented this way?
> 
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

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

Reply via email to