二进制运算符'+'不能应用于两个'T'操作数

use*_*248 16 swift

我正在使用Generics添加不同类型,如Int,Double,Float等.我使用下面的代码,但我得到错误"二元运算符'+'不能应用于两个'T'操作数".

func add<T>(num1: T,num2: T) -> T {
    return num1 + num2
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*ell 33

Swift不知道泛型类型T有一个'+'运算符.你不能在任何类型上使用+:例如在两个视图控制器上+没有太多意义

您可以使用协议一致性让swift了解您的类型!

我在操场上去了,这可能就是你要找的:)

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)
Run Code Online (Sandbox Code Playgroud)

如果您需要在此解释的任何概念,请告诉我


Pau*_*olt 17

在Swift 4/Xcode 9+中,您可以利用数字协议.

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
Run Code Online (Sandbox Code Playgroud)

使用这意味着您不必自己创建特殊协议.

这仅适用于需要Numeric协议提供的功能的情况.您可能需要执行与@adam对%和其他运算符的回答类似的操作,或者您可以在Xcode 9 SDK中利用Apple提供的其他协议.

  • 但是使用这个解决方案,所有类型必须相同......类型必须能够不同,即Int + Float (2认同)

Mus*_*les 6

对于那些希望使用诸如 等比较的人<>只需告诉 Swift 您的泛型类型采用可比较协议,如下所示: -

func genericComparison<T: Comparable>(left: LinkedList<T>, right: LinkedList<T>) -> LinkedList<T>