SwiftにおけるmapとflatMapの集合に対する役割を理解する

1674 ワード

mapとflatMapは関数式プログラミングでよく見られる概念で、pythonなどの言語にあります.mapとflapMap関数を使用すると、配列を別の新しい配列に簡単に変換できます.
map関数は配列によって呼び出され、配列内の各要素に作用する閉パケットをパラメータとして受け入れることができる.閉包は、変換された要素を返し、変換された要素をすべて新しい配列にします.
簡単に言えばmapはマッピング関数であり,一つの集合を別の集合にマッピングする.
SwiftのflatMapは理解しにくいが、flatMapはmap関数に似ているが、nilの値を持つ要素を捨てている.flatMapは配列ではなく容器を処理しているので、よりよく理解することができます.
オプションのタイプを処理するために、flatMapは再ロードされました.オプションタイプの配列が受け入れられ、nil値のないオプションタイプからなるパケットが返されます.
次はflatMapの定義です
extension SequenceType {

    /// Return an `Array` containing concatenated results of mapping `transform`
    /// over `self`.
    func flatMap<S : SequenceType>(@noescape transform: (Self.Generator.Element) -> S) -> [S.Generator.Element]
}

extension SequenceType {

    /// Return an `Array` containing the non-nil results of mapping `transform`
    /// over `self`.
    func flatMap<T>(@noescape transform: (Self.Generator.Element) -> T?) -> [T]
}

次のコード例を参照してください.
let test1 = (1...7).map{ (i : Int) -> String?  in
    return  i > 1 ? String("sss \(i)") : nil
}
print(test1)

let test2 = (1...7).flatMap{ (i : Int) -> String?  in
    return  i > 1 ? String("sss \(i)") : nil
}
print(test2)

実行結果
[nil, Optional("sss 2"), Optional("sss 3"), Optional("sss 4"), Optional("sss 5"), Optional("sss 6"), Optional("sss 7")]["sss 2", "sss 3", "sss 4", "sss 5", "sss 6", "sss 7"]
参考記事
http://swift.gg/2015/08/06/swift-2-flatmap/
https://segmentfault.com/a/1190000004050907