我有一个函数,可以用这样的条件计算数组中的数字总和:
func sumOfArrayWithCondition(array: [Int], filter: (element: Int) -> Bool) -> Int {
var result = 0
for i in 0..<array.count where filter(element: array[i]) {
result += array[i]
}
return result
}
Run Code Online (Sandbox Code Playgroud)
现在我想要它与Int, Float, Double类型一起工作.我试过了,但没有奏效.
protocol Addable {
func +(lhs: Self, rhs: Self) -> Self
}
extension Int: Addable {}
extension Double: Addable {}
extension Float: Addable {}
func sumOfArrayWithCondition<T: Addable>(array: [T], filter: (element: T) -> Bool) -> T {
var result = 0
for i in 0..<array.count where filter(element: array[i]) {
result += array[i] // <-------- Error here
}
return result // <-------- Error here
}
Run Code Online (Sandbox Code Playgroud)
但它说:
二进制运算符'+ ='不能应用于'Int'和'T'类型的操作数
那怎么做呢.
任何帮助将不胜感激.谢谢.
第一个问题是编译器推断Intvar 的类型,result因为你没有声明一个类型并用它初始化它0.但你需要result成为一个类型T.
首先,为了初始化result类型的实例T与价值0,你需要指定Addable也是IntegerLiteralConvertible,这已经是真正的Int,Double和Float.然后你可以声明result为类型T并从那里开始.
正如Rob指出的那样,+=如果您希望能够使用该功能,还需要将该功能添加到协议中.
因此,实现您正在寻找的最终代码是:
protocol Addable : IntegerLiteralConvertible {
func +(lhs: Self, rhs: Self) -> Self
func +=(inout lhs: Self, rhs: Self)
}
extension Int: Addable {}
extension Double: Addable {}
extension Float: Addable {}
func sumOfArrayWithCondition<T: Addable>(array: [T], filter: (element: T) -> Bool) -> T {
var result:T = 0
for i in 0..<array.count where filter(element: array[i]) {
result += array[i]
}
return result
}
Run Code Online (Sandbox Code Playgroud)