<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="">Hmm, it looks like you’re right. I could swear I’ve used flatMap without a closure before…oh well, looks like that’s what happens when you send code without running it in a Playground.<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>
<br class=""><div><blockquote type="cite" class=""><div class="">On Feb 13, 2017, at 5:33 PM, Jon Shier &lt;<a href="mailto:jon@jonshier.com" class="">jon@jonshier.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">According to the compiler, the closure argument for flatMap is not optional or defaulted, so it’s always required. I think it should default to { $0 }, but whatever.<div class=""><br class=""></div><div class=""><br class=""></div><div class="">Jon</div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Feb 13, 2017, at 8:26 PM, Saagar Jha 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=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div 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="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 class=""><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=""><a href="https://lists.swift.org/mailman/listinfo/swift-users" class="">https://lists.swift.org/mailman/listinfo/swift-users</a><br class=""></div></blockquote></div><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=""><a href="https://lists.swift.org/mailman/listinfo/swift-users" class="">https://lists.swift.org/mailman/listinfo/swift-users</a><br class=""></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></body></html>