Reputation: 726
I am using Generics to add different types like Int, Double, Float, etc. I used the code below but I'm getting error "Binary operator '+' cannot be applied to two 'T' operands".
func add<T>(num1: T,num2: T) -> T {
return num1 + num2
}
Upvotes: 24
Views: 15332
Reputation: 1451
protocol Addable {
static func +(lhs: Self, rhs: Self) -> Self
}
func add<T: Addable>(num1: T, _ num2: T) -> T {
return num1 + num2
}
extension Int: Addable {}
extension Double: Addable {}
extension Float: Addable {}
Usage :-
add(num1: 3, 5)
This Code changes of above answer i have added static
keyword otherwise code will not run for latest Swift version
Upvotes: 0
Reputation: 111
To add num1
and num2
, first you need to make sure that it is of type Numeric
. So, the code should look like this:
func add<T : Numeric>(num1: T,num2: T) -> T {
return num1 + num2
}
Upvotes: 1
Reputation: 4412
For those who wish to use comparison such as <
, >
etc, simply tell Swift that your generic type adopt to comperable protocol like so: -
func genericComparison<T: Comparable>(left: LinkedList<T>, right: LinkedList<T>) -> LinkedList<T>
Upvotes: 6
Reputation: 8395
In Swift 4 / Xcode 9+ you can take advantage of the Numeric protocol.
func add<T: Numeric>(num1: T, num2: T) -> T {
return num1 + num2
}
print(add(num1: 3.7, num2: 44.9)) // 48.6
print(add(num1: 27, num2: 100)) // 127
Using this means you won't have to create a special protocol yourself.
This will only work in the cases where you need the functionality provided by the Numeric protocol. You may need to do something similar to @adam's answer for % and other operators, or you can leverage other protocols provided by Apple in the Xcode 9 SDK.
Upvotes: 23
Reputation: 646
Swift doesn't know that the generic type T has a '+' operator. You can't use + on any type: e.g. on two view controllers + doesn't make too much sense
You can use protocol conformance to let swift know some things about your type!
I had a go in a playground and this is probably what you are looking for :)
protocol Addable {
func +(lhs: Self, rhs: Self) -> Self
}
func add<T: Addable>(num1: T, _ num2: T) -> T {
return num1 + num2
}
extension Int: Addable {}
extension Double: Addable {}
extension Float: Addable {}
add(3, 0.2)
Let me know if you need any of the concepts demonstrated here explained
Upvotes: 39