💤

swift クロージャー→変数に代入する形のクロージャ

に公開

swift学習においてクロージャーに詰まる初学者が多いらしいので頑張ってまとめておこうと思います。確かに詰まっております。

この文章だけではイメージが湧きませんので、基本的な構文を記述して分解していきます

クロージャーの基本的な構文

{(parameters) -> return type in
  statement
}
//日本語で
{(引数) -> 戻り値の型 in
  実行する処理
}

具体的な例
人々のリストを年齢でソートするという例

//Person構造体を定義
struct Person {
    ver name: String
    ver age: Int
}

//Personインスタンスを含む配列
var people = [
   Person(name:"kumal",age:35),
   Person(name:"naressyu",age:32),
   Person(name:"abatal",age:25),
]

//実際にクロージャーを使用する例
//people配列を年齢で昇順にソートする
people.sort {(person1, person2) -> Bool in
  return person1.age < person2.age
//person1がperson2より小さい場合にtrueを返すという感じ
//定義した引数を渡すことでクロージャーの中に定義した文を実行し、戻り値で指定した形でreturnされる
}

//出力させる
//forは繰り返し処理です
//peopleという配列の各要素をperson変数に1つづつ割り当てる
for person in people {
   print("\(person.name) is \(person.age) years old")
}

出力結果
abatal is 25 years old
naressyu is 32 years old
kumal is 35 years old

peopleという配列をsortメソッドを用いて、配列内の要素を年齢が小さい順にソートするためのクロージャを定義しています。
イメージとしては、クロージャが引数を待っているイメージ
で、
クロージャとはあらかじめ処理を定義しておいてそこに値を渡すことで処理が実行される無名関数のことである?

もっと例のソース

let greetingClosure: (String) -> String = { (name: String) in
    return "こんにちは、\(name)!"
}
//日本語版
let closureName:(引数型) -> 戻り値型 = {(引数名:引数型)  in
 クロージャ本体
}

let greeting = greetingClosure("aaa")
print(greeting)

let greetingClosure: (String) -> String = { (name: String) in
return "こんにちは、(name)!"
}

こちらを要約すると
引数として渡されたString型の値をnameという名前の変数に代入する

そのname変数を使って、"こんにちは、(name)!"という文字列を生成する

生成された文字列を文字列として返します returnで
という形になります

let greeting = greetingClosure("aaa")
print(greeting)

そしてこちらで、greetingClosureにString型の"aaa"を代入して

クロージャーで処理が実行される

その戻り値をgreetingに代入している

そしてgreetingをprintすることで、こんにちは"aaa"という出力になります。

という形です
これが変数に代入する形のクロージャー

Discussion