Help us understand the problem. What is going on with this article?

flatMapをcompactMapに置換したらerrorでた時の対処

More than 1 year has passed since last update.

問題

flatMapを安易にcompactMap置換したら一部処理が通らない

原因

struct Ints {
    let value: [Int]
}

let i = [Ints(value: [0]) ,Ints(value: [1])]

i.flatMap{ $0.value } //[0, 1]
i.compactMap{ $0.value } //[[0], [1]]

↑の例えだと
flatMapだと[Int]で返って来るが
compactMapだと[[Int]]で返って来るのでbuild通らなくなった

compactMap内で返す値の型が[Any]?[Any]によって返って来る値が変わるらしい
[Any]?ならflatMapが正しいのですが
[Any]のものを取り出すのにflatMap使わなくていいじゃんって話なんですが。。。
修正しました
今回の使い方だとSwift4.1以降でのflatMapの使い方として問題ないので flatMapのままで良かった
ただflatMapを使うことによってwarnigが取れないのしゃあないのかな!?

対応

色々やり方はあると思いますが
一行で書くならreduceでとる

i.reduce(into: [Int]()) { $0 = $0 + $1.value }

@lovee さんから指摘頂き修正

↑の例でのflatMapの使い方でも問題はない

以下Swift4.1以降での使い方

  • compactMap
    • nilを含む要素を取り出す(フィルタリング)
    • Returns an array containing the non-nil results of calling the given transformation with each element of this sequence.
  • flatMap
    • 要素内の要素を取り出す
    • Returns an array containing the concatenated results of calling the given transformation with each element of this sequence.
binc
Eコマースプラットフォーム「BASE」、オンライン決済サービス「PAY.JP」、購入者向けID型決済サービス「PAY ID」の3つのサービスを運営しています。
https://binc.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away