Swiftでの関数プログラミング

クロージャ

まずは引数にクロージャを渡すやり方から。

Stringを引数にとり、Boolを返すクロージャを受け付ける関数は以下の通り。

func doClosure(closure:((arg:String) -> Bool)) {
  val result:Bool = closure("this is argument.")
}

リスト処理

次に、mapとfilter。

例えば属性nameを持つクラスPersonのリストArray<Person>から、nameの値のみのリストArray<String>を抽出するにはmapを利用します。

let personList:Array<Person> = getPersonList()
let nameList:Array<String> = personList.map({
  (person:Person) -> String in
    return person.name
})

さらに、名前がTanakaから始まる人を抽出するには、filterを用いて以下の通り。

let tanakaNameList:Array<String> = nameList.filter({
  (name:String) -> Bool in
    return startsWith(name, "Tanaka")
})

組み合わせると、こんな感じ。

let personList:Array<Person> = getPersonList()
let tanakaNameList:Array<String> = personList.map({
  (person:Person) -> String in
    return person.name
}).filter({
  (name:String) -> Bool in
    return startsWith(name, "Tanaka")
})