Swiftの標準関数にfilterという指定した条件を満たす要素からなる新しい配列を返す関数があります。
[1, 2, 3, 4, 5]
という配列から偶数の個数を求めるコードを書いていきます。
for in
文を使ってカウントした場合です。
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を返すようにします。
このとおり書き換えると次のようになります。
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
を使ってもっと短く書くことができます。
println([1, 2, 3, 4, 5].filter { $0 % 2 == 0 }.count)
文字列の配列でも同様の処理ができます。
println(["りんご", "みかん", "メロン", "バナナ"].filter { $0 != "メロン"}) // [りんご, みかん, バナナ]
最後に指定した値を削除する拡張(extension)を書いてみます。
extension Array {
mutating func remove<T : Equatable>(element: T) -> Array {
return self.filter({$0 as? T != element})
}
}
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]