Swift 内容匹配特定协议的数组运算符,"where" 关键字用法

Swift operators on arrays whose contents match specific protocols, "where" keyword usage

我正在尝试制作一个适用于所有仅包含 Numeric 元素的 Array 的 Swift 运算符,它应该看起来像这样:

prefix operator ∑
prefix func ∑ (array: Array<T>) -> T where T == Numeric {
    var sum: T = 0
    for item in array {
        sum += item
    }
    return sum
}

但这是编译器错误 (error: 'where' clause cannot be attached to a non-generic declaration)

当然,我可以用以下形式编写许多函数:

prefix operator ∑
prefix func ∑ (array: Array<Double>) -> Double {
    var sum: Double = 0
    for item in array {
        sum += item
    }
    return sum
}

这行得通,但泛型的意义在于我不必这样做。

这可能是因为我不明白如何使用 "where" 关键字,但我发现很难搜索这样一个(没有双关语意)通用词,因为我得到了太多不相关的结果。

编辑:

而且我不能写 prefix func ∑ (array: Array<Numeric>) -> Numeric { 因为那时 Swift 不知道如何编译 sum += item.

prefix operator ∑
prefix func ∑ <T>(array: Array<T>) -> T where T: Numeric {
    var sum: T = 0
    for item in array {
        sum += item
    }
    return sum
}

您可以通过键入 <T: Numeric>约束 通用类型为 Numeric,因此函数的签名将是:

func ∑ <T: Numeric>(array: Array<T>) -> T

我还建议使用 reduce(_:_:) 方法来完成这样的任务:

prefix operator ∑
prefix func ∑ <T: Numeric>(array: Array<T>) -> T {
    return array.reduce(0, +)
}

// calling:
let array = Array(repeating: 1, count: 20)
let summation = ∑array // 20

有关泛型类型约束的更多信息,您可以查看 official documentation