Swift の map などで使用する closure には書き方が色々ありますね。
下記のような書き方は知っていました。
let numbers = [0, 1, 2, 3]
// 下記すべて[String]型 ["0", "1", "2", "3"]
numbers.map({ (number: Int) -> String in return String(number) })
numbers.map({ (number: Int) -> String in String(number) }) // 暗黙的な戻り値
numbers.map({ number -> String in String(number) }) // 引数の型省略
numbers.map({ number in String(number) }) // 戻り値の型推論
numbers.map({ String($0) }) // 引数名の省略
numbers.map { String($0) } // 括弧の省略
こんな書き方を発見しました。勉強不足でした。
numbers.map(String.init)
結果は上記の例と同じですが、
単純に numbers.map{ String($0) }
と全く一緒というわけではなさそうです。
http://swiftlife.hatenablog.jp/entry/2015/12/27/213058 こちらで解説されていましたのでご参照ください。
現に、Playgrounds で試すと結果の表示のされ方が異なります。右半分の表示です。
実験
イニシャライザ以外にも使えるのか
いけた。
// いけた
func f(_ number: Int) -> String {
return String(number)
}
numbers.map(f)
// 引数ラベルをアンダースコアで省略できるようにしとかなくてもいい
func ff(number: Int) -> String {
return String(number)
}
numbers.map(ff)
// クラス関数とかでも問題なく使用可
class C {
class func f(_ number: Int) -> String {
return String(number)
}
}
numbers.map(C.f)
関数の引数の数
closure の引数の数と、関数の引数の数があってないと エラー です。
引数2つ目以降無視されるとかはないです。
// エラー!!
func f(a: Int, b: Int) -> String {
return String(a)
}
numbers.map(f)
// これは OK (sorted のクロージャの引数は2つのため)
func ff(a: Int, b: Int) -> Bool {
return true
}
numbers.sorted(by: ff)