Откуда вы знаете, что T
- это тип, который можно добавить?T
может быть чем угодно, не так ли?Что если T
равно Bool
?Значения True
и False
, конечно, не могут быть добавлены.
Чтобы иметь возможность добавлять T
s, диапазон возможных типов для T
должен быть ограничен.T
должен соответствовать протоколу Numeric
.Поскольку протокол Numeric
определяет оператор +
, мы можем быть уверены, что независимо от того, что T
, пока оно соответствует Numeric
, его можно добавить.
Вы можете сделать что-то вродеэто:
func sum<T: Numeric>(_ array: [T]) -> T {
return array.reduce(0, +)
}
или расширение:
extension Sequence where Element : Numeric {
func sum() -> Element {
return reduce(0, +)
}
}
Обратите внимание, что в обоих случаях я установил ограничение : Numeric
.