测量序列上的“sum”扩展

`sum` extension on Measurement Sequence

这是我目前得到的。它至少有这些问题:

  1. Measurement<UnitType> 的数组上使用时崩溃,当 单位是混合的,例如克和毫克。
  2. 使用实例 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
  }
}