Avatar
それは、例示してるmapの中身が単純だから、性質の違いを踏んでいないだけだと思います。 例えば func square<T: Numeric>(of values: [T]) -> [T] { var sum: T = T.zero let ret = values.map { (a) in sum += a return a * a } print("sum is \(sum)") return ret } // ↑これはコンパイルが通るけど // ↓これはエラーになるはずです func square<variadic T: Numeric>(of values: (T...)) -> (T...) { var sum: T = T.zero // ←まずこれが書けないし let ret = values.map { (a) in sum += a // values.0 と values.1は型が違うから + はできない return a * a } print("sum is \(sum)") return ret }
10:50 AM
ジェネリック関数のジェネリックパラメータは呼び出しのたびに具体型が渡されてくるけど、 前者のArrayの例ではmapのクロージャのa はずっと同じ T 型 (squareのスコープで束縛) だけど 後者のTupleの例ではクロージャの a は呼び出されるたびに別のもの。