Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
クロージャ(基本)/ { } / in
Swiftの『クロージャ』は、処理をまとめて変数や引数として渡せる無名関数です。『{ 引数 in 処理 }』の形式で記述します。
構文
// クロージャの基本形
{ (引数名: 型) -> 戻り値の型 in
return 値
}
// 型を変数に代入
let クロージャ名: (引数型) -> 戻り値型 = { 引数名 in
return 値
}
// 関数型の型エイリアス
typealias 型名 = (引数型) -> 戻り値型
構文一覧
| 構文 | 概要 |
|---|---|
| { (引数: 型) -> 戻り値型 in 処理 } | クロージャの完全な記法です。 |
| { 引数 in 処理 } | 型推論によって型を省略した記法です。 |
| let f: (Int) -> Int = { ... } | クロージャを変数に代入します。 |
| func 名前(completion: (型) -> Void) { } | クロージャを引数として受け取る関数を定義します。 |
| closure(引数) | 変数に代入したクロージャを呼び出します。 |
サンプルコード
// クロージャを変数に代入
let greet: (String) -> String = { (name: String) -> String in
return "こんにちは、\(name)さん!"
}
print(greet("太郎"))
// 型推論で省略した書き方
let double: (Int) -> Int = { number in
return number * 2
}
print(double(5))
// 戻り値なしのクロージャ
let printMessage: (String) -> Void = { message in
print("メッセージ: \(message)")
}
printMessage("Hello, Swift!")
// クロージャを引数として渡す
func applyOperation(_ value: Int, operation: (Int) -> Int) -> Int {
return operation(value)
}
let tripled = applyOperation(4) { number in
return number * 3
}
print(tripled) // 12
// 周囲の変数をキャプチャ(クロージャの特性)
func makeCounter() -> () -> Int {
var count = 0
let counter = { () -> Int in
count += 1
return count
}
return counter
}
let counter = makeCounter()
print(counter()) // 1
print(counter()) // 2
print(counter()) // 3
概要
クロージャは周囲のスコープにある変数や定数を「キャプチャ」できます。上記の『makeCounter』の例では、クロージャが関数スコープ内の『count』をキャプチャし、関数が返った後も値を保持し続けます。
クロージャは参照型です。同じクロージャを複数の変数に代入するとキャプチャした値を共有します。クロージャがselfをキャプチャする場合、循環参照に注意が必要です(キャプチャリストで『[weak self]』を指定して防ぎます)。
省略記法やトレイリングクロージャについてはトレイリングクロージャ / 省略記法 / $0を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。