Кортежам необходимо определять количество элементов во время компиляции, поэтому функция типа variadic работать не будет. Вам нужно будет добавить переопределения для оператора +
для каждого размера кортежа, который вам нужно поддерживать:
func +<T : Numeric> (x: (T, T), y: (T, T)) -> (T, T) {
return (x.0 + y.0, x.1 + y.1)
}
func +<T : Numeric> (x: (T, T, T), y: (T, T, T)) -> (T, T, T) {
return (x.0 + y.0, x.1 + y.1, x.2 + y.2)
}
func +<T : Numeric> (x: (T, T, T, T), y: (T, T, T, T)) -> (T, T, T, T) {
return (x.0 + y.0, x.1 + y.1, x.2 + y.2, x.3 + y.3)
}
// and so on, ...
В качестве альтернативы, вы можете переключаться на другие типы данных, например массивы, которые допускают динамическое количество элементов:
infix operator ++
func ++<T: Numeric>(_ lhs: [T], _ rhs: [T]) -> [T] {
return zip(lhs, rhs).map { $0.0 + $0.1 }
}
print([10, 12, 16] ++ [11, 36, 25]) // [21, 48, 41]
Предостережения этого подхода:
- вам нужно использовать другой оператор, поскольку
+
уже определен для массивов, и он объединяет массивы вместо индивидуального суммирования соответствующих элементов
- если два массива имеют разные размеры, то результат будет иметь размер меньших массивов из двух входных.