LoginSignup
7
12

More than 3 years have passed since last update.

Swift - filterを使った配列操作とその使用例を丁寧に解説

Last updated at Posted at 2019-06-02

filterの使いどころ

配列の中から、指定した条件に当てはまるものだけを残したい場合に使います。
filterを使うと新しい配列が得られ、もとの配列を変更するわけではないという点に注意しましょう。

Sample1.swift
// グループの年齢を格納する配列があるとする(22才, 35才...)
let ages = [22, 35, 19, 24, 28, 17, 20, 18]

// 未成年者(minor)の年齢だけを残した配列を作り、minorAgesに代入する
let minorAges = ages.filter { $0 < 20 }
print(minorAges) // [19, 17, 18]

// もとの配列は変わらない
print(ages)      // [22, 35, 19, 24, 28, 17, 20, 18]

filterの書き方

{ $0 < 20 }の部分でその要素を残すか残さないかの条件を指定します。
$0には配列の要素が順番に入っていき、{ }内がtrueと判定されればその要素は残ります。反対に、{ }内がfalseと判定されればその要素は新しい配列には含まれません。

例えば上の例では、最初に$0には配列の最初の値の22が入ります。
{ 22 < 20 }の判定はfalseになるので、この22は新しい配列の中に含まれずに除外されます。
一方、配列内の19, 17, 18に関しては{ $0 < 20 }の判定がtrueになるので、新しい配列に含まれます。

filterとisEmptyを組み合わせた便利な書き方

実際の現場でよく見るfilterisEmptyを組み合わせた書き方の紹介です。
例としてグループの中に未成年者が1人でもいたら入れないPUBを考えてみましょう。
以下のように書けば、1人も未成年者がいなければcanEnterPubtrueとなり、未成年者がいる場合canEnterPubfalseとなります。

Sample2.swift
// グループの年齢を格納する配列があるとする(22才, 35才...)
let ages = [22, 35, 19, 24, 28, 17, 20]

// Pubに入れるかを判定し、結果をcanEnterPubに代入する
let canEnterPub = ages.filter { $0 < 20 }.isEmpty

print(canEnterPub) // false

Sample1.swiftの例で見たように、ages.filter {$ < 20}の部分は[19, 17, 18]になります。今回はそれを新しい変数に代入するのではなく、配列がもともと持つisEmptyをそのまま適用しています配列.isEmptyのように書けば、配列の中身が空っぽであるときにtrueを、要素が1つでもあればfalseを返します。

これを利用して、PUBに入れるか(= 未成年者が1人もいないか)というのをたった1行で判定して変数に結果を格納しています。このような便利な書き方もあわせて試してみてください。

追記

@herara_ofnir3 様がコメントでallSatisfyを利用したより良い別解を提示して頂きました!

ちなみに

僕は新しく知ったことを実際にコードで確かめたい時にはpaiza.ioをよく使っています。ちょっとしたアウトプットをするときなどに重宝しています。

関連

Swiftにおけるreduceの使い方

7
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
12