LoginSignup
3
3

More than 3 years have passed since last update.

Swift で map (closure) のこんな書き方

Last updated at Posted at 2020-03-17

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)

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3