##filterの使いどころ
配列の中から、指定した条件に当てはまるものだけを残したい場合に使います。
filterを使うと新しい配列が得られ、もとの配列を変更するわけではないという点に注意しましょう。
// グループの年齢を格納する配列があるとする(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を組み合わせた便利な書き方
実際の現場でよく見るfilter
とisEmpty
を組み合わせた書き方の紹介です。
例としてグループの中に未成年者が1人でもいたら入れないPUBを考えてみましょう。
以下のように書けば、1人も未成年者がいなければcanEnterPub
はtrue
となり、未成年者がいる場合canEnterPub
はfalse
となります。
// グループの年齢を格納する配列があるとする(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の使い方