この世でいちばんわかりやすいiPhoneアプリ開発のおはなし【関数プログラミングを学ぶ】
配列、ループ構文、条件分岐構文について知っておくと、このページの理解が深まります。配列については、こちらのページで説明しています。条件分岐構文については、こちらのページで説明しています。
データを絞り込む
配列の要素を「ある条件」で絞り込むプログラムを考えます。
ここでは題材として、友達の名前が並んだ文字列のコレクションを扱います。
let names = ["Adam", "Eddy", "Bill", "Alex", "Charie"]
それでは、「名前がAで始まる友達」だけに絞り込んだ配列を作成しましょう。 絞り込んだデータを追跡するための配列を作成しておきます。
var filteredNames = [String]()
ループ構文と条件分岐構文を使って、絞り込み手続きを行うことができます。 なお、文字列の先頭文字は、firstプロパティで取得できます。
for name in names {
if name.first == "A" {
filteredNames.append(name)
}
}
上のコードを実行すると、絞り込んだ配列には「アダム、アレックス」が並びます。
print(filteredNames)
// ["Adam", "Alex"]
配列のfilter(_:)メソッド
関数プログラミング的なアプローチでは、このような手続きをよりシンプルに記述することができます。
Swiftでは、filter(_:)メソッドを使って配列データの絞り込むことができます。 filter(_:)メソッドは、パラメータとして「絞り込みの条件式」を受け取ります。 この「絞り込み条件」は、クロージャ式を使って記述されます。
filteredNames = names.filter({ name in
name.first == "A"
})
// ["Adam", "Alex"]
クロージャ式を最適化する
クロージャ式を最適化すると、記述がより簡潔になります。
クロージャ式が受け取るパラメータは、ドル記号$を使って省略できます。
filteredNames = names.filter({ $0.first == "A" })
// ["Adam", "Alex"]
上のコードは、クロージャ式におけるnameパラメータ名の宣言を省略して、簡易的な$0としています。
さらに、関数やメソッドが最後のパラメータとしてクロージャ式を受け取る場合、括弧()を省略できます。
filteredNames = names.filter { $0.first == "A" }
// ["Adam", "Alex"]
上のコードは、配列データの絞り込みを1行で実行します。 関数プログラミング的なアプローチでは、ループ構文や条件分岐構文を省略してコードを簡潔に記述できます。