Swift Closure クロージャ記法 いろいろ
環境
- Swift 1.2
Swiftのクロージャ構文
{ (仮引数) -> (戻り値の型) in クロージャ Body }
Swiftのクロージャ記法いろいろ
前提
以下のIntの配列とsortedを例として使用する。
let numbers: Array<Int> = [5, 4, 9, 10, 6, 3, 1, 7, 2]
sortedはArrayに定義されていて、以下のように引数にクロージャをとる。
func sorted(isOrderedBefore: (T, T) -> Bool) -> [T]
クロージャ その1 基本型
普通に書くと
numbers.sorted({(num1: Int, num2: Int) -> Bool in return num1 < num2 }) // これの戻り値は [1, 2, 3, 4, 5, 6, 7, 9, 10]
クロージャ その2
型数論により、引数の型を省略できる。
numbers.sorted({(num1 , num2) -> Bool in return num1 < num2 })
クロージャ その3
引数の個数がわかっているとき、引数リストを簡略化できる。
numbers.sorted({num1 , num2 -> Bool in return num1 < num2 })
クロージャ その4
型数論により、戻り値の型とアロー(->)を省略できる。
numbers.sorted({num1 , num2 in return num1 < num2 })
クロージャ その5
Body部が1行のとき、return を省略できる。
numbers.sorted({num1 , num2 in num1 < num2 })
クロージャ その6
仮引数は $i でi番目の引数を表し、仮引数を省略できる。
numbers.sorted({ $0 < $1 })
クロージャ その7
Int型に定義されている「<」オペレータは2引数を取り、 ブール値を返す関数と同じなので、以下のように書ける。
numbers.sorted(<)
クロージャ その8:接尾クロージャ (Trailing Closure)
関数の最後にクロージャをとる場合、クロージャを引数の外側に書ける。
numbers.sorted(){(num1: Int, num2: Int) -> Bool in return num1 < num2 }
クロージャ その9
理由はわからないがこの場合、sortedの丸括弧を省略できる。
numbers.sorted{(num1: Int, num2: Int) -> Bool in return num1 < num2 }