Вот что у меня есть на данный момент. У него есть как минимум следующие проблемы:
- Он дает сбой при использовании в массиве
Measurement<UnitType>
, когда единицы измерения смешиваются, например, с граммами и миллиграммами. - Использование свойства экземпляра
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
)
}
}