2017-01-09 4 views
1
func multiply<T: Strideable> (lhs: T, rhs: T) -> T { 
    return lhs * rhs 
} 

Почему это возвращение к ошибке: кандидаты Нет «*» производят ожидаемый контекстная результата тип результата «T»Generic Swift Функция Error Swift 3,0

ответ

0

нашел работу вокруг, расширив * оператора типы Double, Int и Float.

protocol Numeric { 
    func *(lhs: Self, rhs: Self) -> Self 
} 

extension Double: Numeric {} 
extension Float: Numeric {} 
extension Int: Numeric {} 
+1

Хороший эксперимент, но мне интересно, какие недостатки в распространении всех этих примитивных типов с протоколом, который перегружает символ умножения, есть, если таковые имеются? – clearlight

+0

Это прекрасно, и оператор умножения не перегружен, он просто пропускает функции, которые используют числовой тип, доступный этому оператору для использования – MathewS

0

Посмотрите в Strideable протокол, он не имеет метод ''. Если вы предпочитаете это так, чтобы «T» можно было умножить на другое «T», вы должны скорее объявить его таким образом, чтобы «T» имел «».

func multiply<T: Strideable> (lhs: T, rhs: T) -> T where T:IntegerArithmetic { 
    return lhs * rhs 
} 

Или вы также можете сделать то, что предлагает другой ответ, поскольку с помощью этого метода вы можете использовать только целые числа.