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 }
a
はずっと同じ T
型 (squareのスコープで束縛) だけど 後者のTupleの例ではクロージャの a
は呼び出されるたびに別のもの。