<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="">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.<div class=""><br class=""><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Saagar Jha</div>

</div><div class=""><br class="webkit-block-placeholder"></div><div class="">P.S. You can call flatMap without a closure: deep.flatMap().flatMap()</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On Feb 13, 2017, at 4:31 PM, Maxim Veksler via swift-users &lt;<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi everyone,<div class=""><br class=""></div><div class="">I've discovered today that Swift will actually choose 2 very differently behaving types of flatMap implementation based on the input signature.&nbsp;</div><div class=""><br class=""></div><div class="">For a Sequence of options it will call a flatMap that filters out nil's. For a&nbsp;Sequence&nbsp;of Sequence's it will call a flattening function, without filtering.</div><div class=""><br class=""></div><div class=""><font color="rgba(0, 0, 0, 0.298039)" class="">Leading to code that (IMHO) reads very not&nbsp;</font><font color="#000029" class="">inconsistency, and unexpected. Sometime even looking a bit funny such as&nbsp;</font><font color="rgba(0, 0, 0, 0.298039)" class="">collection.flatMap.flatMap:</font></div><div class=""><font color="rgba(0, 0, 0, 0.298039)" class=""><br class=""></font></div><div class=""><pre style="word-wrap:break-word;white-space:pre-wrap" class="">  5&gt; 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&gt; deep.flatMap { $0 }
$R1: [String?] = 6 values {
  [0] = "1989"
  [1] = nil
  [2] = nil
  [3] = "Red"
  [4] = nil
  [5] = nil
}
  7&gt; deep.flatMap { $0 }.flatMap { $0 }
$R2: [String] = 2 values {
  [0] = "1989"
  [1] = "Red"
}</pre>I wonder why it was implemented this way?</div><div class=""><br class=""></div><div class=""><br class=""></div></div>
_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-users<br class=""></div></blockquote></div><br class=""></div></body></html>