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。
我正在尝试制作一个适用于所有仅包含 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。