作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
是否可以为专门化/构造的泛型类型扩展泛型类?我想用一种方法来扩展 Int Arrays 来计算其元素的总和。
例如
extension Array<Int> {
func sum() -> Int {
return reduce(0) { $0 + $1 }
}
}
最佳答案
这可以使用协议(protocol)扩展来实现(有关更多信息,请参阅 The Swift Programming Language: Protocols)。
要对 Int
求和,您可以这样做:
extension Sequence where Iterator.Element == Int {
var sum: Int {
return reduce(0, +)
}
}
用法:
let nums = [1, 2, 3, 4]
print(nums.sum) // Prints: "10"
或者,对于更通用的东西(Swift 5),您可以使用 AdditiveArithmetic
:
extension Sequence where Iterator.Element: AdditiveArithmetic {
var sum: Iterator.Element {
return reduce(.zero, +)
}
}
对于 Swift 4 及以下版本,您可以使用@Wes Campaigne 建议的内容并创建一个 Addable
协议(protocol):
protocol Addable {
init()
func + (lhs: Self, rhs: Self) -> Self
}
extension Int : Addable {}
extension Double: Addable {}
extension String: Addable {}
...
接下来,扩展 Sequence
以添加 Addable
元素的序列:
extension Sequence where Iterator.Element: Addable {
var sum: Iterator.Element {
return reduce(Iterator.Element(), +)
}
}
用法:
let doubles = [1.0, 2.0, 3.0, 4.0]
print(doubles.sum) // Prints: "10.0"
let strings = ["a", "b", "c"]
print(strings.sum) // Prints: "abc"
关于generics - Swift 中构造泛型类型的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24047164/
我是一名优秀的程序员,十分优秀!