泛型类型的函数

Khu*_*ong 3 generics swift

我有一个函数,可以用这样的条件计算数组中的数字总和:

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'类型的操作数

那怎么做呢.

任何帮助将不胜感激.谢谢.

Dan*_*all 6

第一个问题是编译器推断Intvar 的类型,result因为你没有声明一个类型并用它初始化它0.但你需要result成为一个类型T.

首先,为了初始化result类型的实例T与价值0,你需要指定Addable也是IntegerLiteralConvertible,这已经是真正的Int,DoubleFloat.然后你可以声明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)