LoginSignup
16
17

More than 5 years have passed since last update.

filterの使い方

Last updated at Posted at 2015-03-18

Swiftの標準関数にfilterという指定した条件を満たす要素からなる新しい配列を返す関数があります。

[1, 2, 3, 4, 5]という配列から偶数の個数を求めるコードを書いていきます。

for in文を使ってカウントした場合です。

sample1.swift
var count = 0
for n in [1, 2, 3, 4, 5] {
  if n % 2 == 0 {
    count++
  }
}
println(count)

実行結果は2となります。偶数は2と4の2つなので実行結果は正しいことがわかります。

次にfilterを使います。
ドキュメントを読むと、func filter(includeElement: (T) -> Bool) -> [T]とあります。
Tは型を示すので、今回の場合はIntとなります。返り値はBoolなので何かの処理をしてBoolを返せばいいことがわかります。今回は偶数のときにtrueを返すようにします。
このとおり書き換えると次のようになります。

sample2.swift
println([1, 2, 3, 4, 5].filter({(n:Int) -> Bool in return n % 2 == 0}).count)

1行になりました。実行結果は2となり、実行結果は正しいです。

コードを分解してみてみます。
[1, 2, 3, 4, 5].filter({(i:Int) -> Bool in return i % 2 == 0})
この実行結果は、[2, 4]となります。次に.countで配列の数を求めます。
従って実行結果は2となります。

第2引数の関数は引数を1つしか取らないため$0を使ってもっと短く書くことができます。

sample3.swift
println([1, 2, 3, 4, 5].filter { $0 % 2 == 0 }.count)

文字列の配列でも同様の処理ができます。

sample4.swift
println(["りんご", "みかん", "メロン", "バナナ"].filter { $0 != "メロン"}) // [りんご, みかん, バナナ]

最後に指定した値を削除する拡張(extension)を書いてみます。

sample5.swift
extension Array {
    mutating func remove<T : Equatable>(element: T) -> Array {
        return self.filter({$0 as? T != element})
    }
}
sample6.swift
var fruits:[String] = ["りんご", "みかん", "メロン", "バナナ"] as [String]
println(fruits.remove("メロン")) // [りんご, みかん, バナナ]

var num:[Int] = [1, 2, 3, 4, 5] as [Int]
println(num.remove(3)) // [1, 2, 4, 5]
16
17
0

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
16
17