Необходимо указать, что добавление поддержки типа (T). Вы можете сделать это, объявляя собственный протокол, например:
protocol Addition {
func +(lhs: Self, rhs: Self) -> Self
}
Теперь просто указать, что T реализовать:
func myFunc<T: Addition>(t1: T, t2: T) -> T {
return t1 + t2
}
Последний шаг распространяется тип, который вы хотите передать в качестве параметра ваша функция для реализации этого протокола, например Int:
extension Int: Addition {}
Вам даже не нужно реализовывать + функцию, потому что Int уже делает это. Вы можете расширить любой тип вы хотите, включая другие протоколы для реализации Сложения один и после этой безопасности передать его в функцию:
myFunc(2, t2: 4)
// EDITED
Вы можете использовать протокол IntegerArithmeticType
реализующие +, -, *, /,%, но все зависит от ваших требований. Если вы создаете собственный класс, который вы хотите передать экземпляру в свою функцию, вы должны реализовать всю операцию, но если вы собираетесь только вызывать свою функцию на стандартных типах, таких как Int. Вы экономите время, и вам не нужно создавать собственный протокол. Пример:
func myFunc<T: IntegerArithmeticType>(t1: T, t2: T) -> T {
return t1 + t2
}
myFunc(2, t2: 4)
Кажется немного некрасиво, что нам нужно явно объявить, что каждый класс мы могли бы назвать 'myFunc' на поддерживает добавление, даже если это очевидно, как и в случае' Int'. Слишком плохо, что нет способа заставить его «просто работать». Тем не менее, это очень полезный ответ, спасибо. – BallpointBen
@Robert, пожалуйста, см. Отредактированный ответ. – Greg
Спасибо, протокол IntegerArithmeticType полезен, за исключением того, что я * только * должен поддерживать добавление, и на самом деле сценарий, который я имею в виду, использует класс, который поддерживает добавление, но никаких других арифметических операций, поэтому IntegerArithmeticType является слишком строгим , Все-таки очень полезное редактирование. Спасибо. – BallpointBen