Swift

Swiftのクロージャによるジェネリック特殊化方法

Array#mapの定義

public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

上記のTを特殊化させるクロージャ生成方法数パターン

ジェネリック関数を特殊化する方法は

  • 引数からの型推論による特殊化
  • 戻り値からの型推論による特殊化

参考:Swift実践入門

とあるが、ここでは

  • クロージャによる戻り値からの型推論による特殊化
  • クロージャによる戻り値からの明示的特殊化

を記載してみる。

let a = [1, 2]

// 受け取る値に名前を付ける方法
let b = a.map { hoge in
    hoge * 2 // 型推論でIntとわかる
}

// 受け取る値に名前を付けて、返り値の型も書く方法(ここまで書くのは冗長な場面が多いはず)
let c = a.map { hoge -> Int in // 明示的にIntとわかる
    hoge * 2
}

// 受け取る値に名前を付けない方法
let d = a.map { $0 * 2 }  // 型推論でIntとわかる

// 好ましいかどうかは別として、こういうこともできる... 
let e = a.map { hoge -> Void in }     //=> [(), ()]     明示的にVoidとわかる
let f = a.map { hoge -> Double in 1 } //=> [1.0, 1.0]   明示的にDoubleとわかる