В качестве упражнения я пытаюсь расширить Array
в Swift, чтобы добавить функцию-член sum()
. Это должно быть типобезопасно, так как я хочу, чтобы вызов sum()
компилировался только в том случае, если массив содержит элементы, которые могут быть добавлены.
Я пробовал несколько вариантов чего-то вроде этого:
extension Array {
func sum<U : _IntegerArithmeticType where U == T>() -> Int {
var acc = 0
for elem in self {
acc += elem as Int
}
return acc
}
}
Идея заключалась в том, чтобы сказать: «Хорошо, это универсальная функция, универсальный тип должен быть чем-то вроде Int
, а также должен быть таким же, как T
, тип элементов массива». Но компилятор жалуется: «Требование одинакового типа делает общие параметры U и T эквивалентными». Правильно, так и должно быть, с дополнительным ограничением T : _IntegerArithmeticType
.
Почему компилятор не позволяет мне это сделать? Как мне это сделать?
(Я знаю, что позже мне придется исправить, как складываются вещи и какой именно тип возвращаемого значения, но пока я застрял на ограничении типа.)