見出し画像

この世でいちばんわかりやすい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行で実行します。 関数プログラミング的なアプローチでは、ループ構文や条件分岐構文を省略してコードを簡潔に記述できます。

いいなと思ったら応援しよう!