测量序列上的“sum”扩展
`sum` extension on Measurement Sequence
这是我目前得到的。它至少有这些问题:
- 在
Measurement<UnitType>
的数组上使用时崩溃,当
单位是混合的,例如克和毫克。
- 使用实例
zero
属性 不如静态替代方案好,它允许 return 类型成为类型的 zero
,而不是 nil
,用于空序列。我不知道这是否可以避免。
我使用第一个扩展名,因为 Sequence.first
在 Swift 的当前版本中不存在。
import Foundation
public extension Sequence {
var first: Iterator.Element? {
return self.first{_ in true}
}
}
public extension Sequence where Iterator.Element: SummableUsingInstanceZero {
var sum: Iterator.Element? {
guard let zero = first?.zero
else {return nil}
return self.reduce(zero, +)
}
}
public protocol SummableUsingInstanceZero {
static func + (_: Self, _: Self) -> Self
var zero: Self {get}
}
extension Measurement: SummableUsingInstanceZero {
public var zero: Measurement {
return Measurement(
value: 0,
unit: unit
)
}
}
这个问题很老了,但是解决方案仍然没有内置。符合 AdditiveArithmetic
才是正确的选择!
import Foundation
extension Measurement: AdditiveArithmetic where UnitType: Dimension {
public static var zero: Self {
Self( value: 0, unit: .baseUnit() )
}
public static func += (measurement0: inout Self, measurement1: Self) {
measurement0 = measurement0 + measurement1
}
public static func -= (measurement0: inout Self, measurement1: Self) {
measurement0 = measurement0 - measurement1
}
}
这是我目前得到的。它至少有这些问题:
- 在
Measurement<UnitType>
的数组上使用时崩溃,当 单位是混合的,例如克和毫克。 - 使用实例
zero
属性 不如静态替代方案好,它允许 return 类型成为类型的zero
,而不是nil
,用于空序列。我不知道这是否可以避免。
我使用第一个扩展名,因为 Sequence.first
在 Swift 的当前版本中不存在。
import Foundation
public extension Sequence {
var first: Iterator.Element? {
return self.first{_ in true}
}
}
public extension Sequence where Iterator.Element: SummableUsingInstanceZero {
var sum: Iterator.Element? {
guard let zero = first?.zero
else {return nil}
return self.reduce(zero, +)
}
}
public protocol SummableUsingInstanceZero {
static func + (_: Self, _: Self) -> Self
var zero: Self {get}
}
extension Measurement: SummableUsingInstanceZero {
public var zero: Measurement {
return Measurement(
value: 0,
unit: unit
)
}
}
这个问题很老了,但是解决方案仍然没有内置。符合 AdditiveArithmetic
才是正确的选择!
import Foundation
extension Measurement: AdditiveArithmetic where UnitType: Dimension {
public static var zero: Self {
Self( value: 0, unit: .baseUnit() )
}
public static func += (measurement0: inout Self, measurement1: Self) {
measurement0 = measurement0 + measurement1
}
public static func -= (measurement0: inout Self, measurement1: Self) {
measurement0 = measurement0 - measurement1
}
}