2

作为练习,我正在尝试Array在 Swift 中进行扩展以添加sum()成员函数。这应该是类型安全的,我希望sum()仅当数组包含可以添加的元素时才调用编译。

我尝试了一些这样的变体:

extension Array {

    func sum<U : _IntegerArithmeticType where U == T>() -> Int {
        var acc = 0
        for elem in self {
            acc += elem as Int
        }
        return acc
    }

}

这个想法是说,“好吧,这是一个泛型函数,泛型类型必须类似于Int,并且还必须与T数组元素的类型相同”。但是编译器抱怨:“相同类型的要求使泛型参数 U 和 T 等效”。没错,他们应该是,加上额外的约束T : _IntegerArithmeticType

为什么编译器不让我这样做?我该怎么做?

(我知道我应该稍后修复事物是如何相加的以及返回类型到底是什么,但我现在被困在类型约束上。)

4

1 回答 1

3

根据 Martin R 的评论,目前这是不可能的。在这种特殊情况下,我很想使用的东西是显式传递T -> Int转换函数:

extension Array {

    func sum(toInt: T -> Int?) -> Int {
        var acc = 0
        for elem in self {
            if let i = toInt(elem) {
                acc += i
            }
        }
        return acc
    }

}

然后我可以写这样的东西:

func itself<T>(t: T) -> T {
    return t
}

let ss = ["1", "2", "3", "4", "five"].sum { $0.toInt() }
let si = [1, 2, 3, 4].sum(itself)

但是,必须传递一个显式函数。该(itself)部分当然可以替换为{ $0 }。(其他人已经调用了该itself函数identity。)

请注意,A -> B可以在A -> B?需要时传递函数。

于 2015-01-28T11:16:46.883 回答