2016-02-03 8 views
0

У меня есть следующие функции:Проверьте общие опоры арифметические операции

func myFunc<T>(t1: T, t2: T) -> T { 
    return t1 + t2 
} 

компилятор (по праву) не позволяет это, потому что он не знает, поддерживает ли T дополнение. Есть ли способ указать, что T должен поддерживать добавление, точно так же, как можно указать, что T должен соответствовать данному протоколу? Я посмотрел онлайн и ничего не нашел о протоколе, который гарантирует поддержку +.

ответ

1

Необходимо указать, что добавление поддержки типа (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) 
+0

Кажется немного некрасиво, что нам нужно явно объявить, что каждый класс мы могли бы назвать 'myFunc' на поддерживает добавление, даже если это очевидно, как и в случае' Int'. Слишком плохо, что нет способа заставить его «просто работать». Тем не менее, это очень полезный ответ, спасибо. – BallpointBen

+0

@Robert, пожалуйста, см. Отредактированный ответ. – Greg

+0

Спасибо, протокол IntegerArithmeticType полезен, за исключением того, что я * только * должен поддерживать добавление, и на самом деле сценарий, который я имею в виду, использует класс, который поддерживает добавление, но никаких других арифметических операций, поэтому IntegerArithmeticType является слишком строгим , Все-таки очень полезное редактирование. Спасибо. – BallpointBen

Смежные вопросы