タコさんブログ

プログラミングメモと小言

Swift Closure クロージャ記法 いろいろ

環境

Swiftクロージャ構文

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
}