Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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の使い方

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