30

Swift 4.1 flatMapでは廃止されたようです。しかし、同じことをしているSwift 4.1 の新しいメソッドがありますか? コレクション内の各オブジェクトを変換してから、nil だったアイテムを削除できます compactMapflatMap のようにflatMap

let array = ["1", "2", nil] 
array.flatMap { $0 } // will return "1", "2"

コンパクトマップのように

let array = ["1", "2", nil] 
array.compactMap { $0 } // will return "1", "2"

compactMap同じことをしています。

これら2つの方法の違いは何ですか? Apple がメソッドの名前を変更したのはなぜですか?

4

3 に答える 3

20

には 3 つの異なるバリエーションがありflatMapます。Sequence.flatMap(_:)Optional 値を返すクロージャーを受け入れるバリアントは廃止されました。flatMap(_:)Sequence と Optionalの両方のその他のバリアントはそのまま残ります。提案書に記載されている理由は、誤用によるものです。

非推奨flatMapのバリアント機能は、新しいメソッドの下でもまったく同じcompactMapです。

詳細はこちらをご覧ください。

于 2018-03-15T03:47:32.173 に答える
0

高次関数- 引数または/および返される別の関数によって動作する関数です。例 - 並べ替え、マップ、フィルター、削減...

マップ vs コンパクトマップ vs フラットマップ

[RxJava Map vs FlatMap]

  • map- 変換 (オプション、シーケンス、文字列)
  • compactMap- nil(Array) を削除
  • flatMap- 困難な構造を単一のものにフラット化 (オプション、コレクション)

flatMapcompactMap

Swift v4.1 より前は、 の 3 つの実現flatMap( なしでcompactMap) がありました。その実現は、シーケンスから nil を削除する責任がありました。そして、それは以上のものでしmapflatMap

実験

//---------------------------------------
//map - for Optional, Sequence, String, Combine
//transform

//Optional
let mapOptional1: Int? = Optional(1).map { $0 } //Optional(1)
let mapOptional2: Int? = Optional(nil).map { $0 } //nil
let mapOptional3: Int?? = Optional(1).map { _ in nil } //Optional(nil)
let mapOptional4: Int?? = Optional(1).map { _ in Optional(nil) } //Optional(nil)

//collection
let mapCollection1: [Int] = [1, 2].map { $0 } //[1, 2]
let mapCollection2: [Int?] = [1, 2, nil, 4].map { $0 } //Optional(1), Optional(2), nil, Optional(4),
let mapCollection3: [Int?] = ["Hello", "1"].map { Int($0) } //[nil, Optional(1)]

//String
let mapString1: [Character] = "Alex".map { $0 } //["A", "l", "e", "x"]

//---------------------------------------
//compactMap(one of flatMap before 4.1) - Array, Combine
//removes nil from the input array

//Collection
let compactMapCollection1: [Int] = [1, 2, nil, 4].compactMap { $0 } //[1, 2, 4]
let compactMapCollection2: [[Int]] = [[1, 2], nil, [3, 4]].compactMap { $0 } //[[1, 2], [3, 4]]

//---------------------------------------
//flatMap - Optional, Collection, Combime

//Optional
let flatMapOptional1: Int? = Optional(1).flatMap { $0 } //Optional(1)
let flatMapOptional2: Int? = Optional(nil).flatMap { $0 } //nil
let flatMapOptional3: Int? = Optional(1).flatMap { _ in nil }
let flatMapOptional4: Int? = Optional(1).flatMap { _ in Optional(nil) }

//Collection
let flatMapCollection1: [Int] = [[1, 2], [3, 4]].flatMap { $0 } //[1, 2, 3, 4]
let flatMapCollection2: [[Int]] = [[1, 2], nil, [3, 4]].flatMap { $0 } //DEPRECATED(use compactMap): [[1, 2], [3, 4]]
let flatMapCollection3: [Int?] = [[1, nil, 2], [3, 4]].flatMap { $0 } //[Optional(1), nil, Optional(2), Optional(3), Optional(4)]
let flatMapCollection4: [Int] = [1, 2].flatMap { $0 } //DEPRECATED(use compactMap):[1, 2]

[Swift Optional map vs flatMap]
[Swift Functor、Applicative、Monad]

于 2021-11-06T19:24:55.740 に答える