```sum在测量序列上的扩展名

问题描述 投票:0回答:1

这是我目前所拥有的。它至少存在以下问题:

  1. 当在Measurement<UnitType>的数组上使用时,当单位混合在一起,例如克和毫克。
  2. 使用实例zero属性不如静态替代方法好,它允许返回类型为空序列的返回类型为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
        )
    }
}
swift foundation measurement
1个回答
0
投票

这个问题很旧,但是解决方案仍然不是内置的。遵循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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.