Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
トレイリングクロージャ / 省略記法 / $0
Swiftでは関数の最後の引数がクロージャの場合、括弧の外に書ける「トレイリングクロージャ」構文が使えます。さらに『$0』『$1』などの省略記法でより簡潔に書けます。
構文
// 通常の書き方
関数名(引数, クロージャ引数: { 処理 })
// トレイリングクロージャ
関数名(引数) { 処理 }
// クロージャ引数が1つだけの場合(ラベルごと省略)
関数名 { 処理 }
// $0 省略記法(引数名を省略)
関数名 { $0 * 2 }
// 演算子関数(さらに省略)
[1,2,3].sorted(by: >)
構文一覧
| 構文 | 概要 |
|---|---|
| 関数名() { 処理 } | 最後の引数のクロージャを括弧の外に出します。 |
| 関数名 { 処理 } | クロージャのみが引数の場合、括弧ごと省略できます。 |
| $0, $1, $2 | クロージャの引数を位置で参照する省略記法です。 |
| { $0 > $1 } | 2つの引数を比較するクロージャの省略形です。 |
| sorted(by: >) | 演算子関数をクロージャの代わりに渡します。 |
| map(\.property) | キーパスをクロージャの代わりに渡します。 |
サンプルコード
let numbers = [3, 1, 4, 1, 5, 9, 2, 6]
// 通常の書き方
let sorted1 = numbers.sorted(by: { (a: Int, b: Int) -> Bool in
return a < b
})
// 型推論で省略
let sorted2 = numbers.sorted(by: { a, b in
return a < b
})
// return を省略(単一式)
let sorted3 = numbers.sorted(by: { a, b in a < b })
// $0 / $1 省略記法
let sorted4 = numbers.sorted(by: { $0 < $1 })
// 演算子関数(最も簡潔)
let sorted5 = numbers.sorted(by: <)
print(sorted5) // [1, 1, 2, 3, 4, 5, 6, 9]
// トレイリングクロージャ
let doubled = numbers.map { $0 * 2 }
print(doubled) // [6, 2, 8, 2, 10, 18, 4, 12]
let evens = numbers.filter { $0 % 2 == 0 }
print(evens) // [4, 2, 6]
// 複数のトレイリングクロージャ(Swift 5.3以降)
func doAction(success: () -> Void, failure: () -> Void) {
success()
}
doAction {
print("成功!")
} failure: {
print("失敗...")
}
概要
トレイリングクロージャ構文と省略記法を組み合わせることで、Swiftのコレクション操作(map・filter・sorted等)を非常に簡潔に記述できます。
『$0』はクロージャの第1引数、『$1』は第2引数を参照します。引数が1つの場合は主に『$0』のみ使います。省略記法を使いすぎると可読性が下がることがあります。複雑なロジックでは引数名を明示した方が読みやすくなります。
@escaping やキャプチャリストについては@escaping / @autoclosure / キャプチャリストを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。