Вы можете создать протокол, заставить Measurement
соответствовать ему и ограничить коллекцию Element
этим протоколом:
protocol Valued {
var value: Double { get }
}
extension Measurement: Valued { }
extension Collection where Element: Valued {
func test() {
print(self)
}
// note that it is pointless to sum different types of units
var sum: Double {
reduce(0) { $0 + $1.value }
}
// you would need to cast every element to the appropriate unit type before calculating its sum
var totalLengthInMeters: Double {
reduce(0) {
$0 + (($1 as? Measurement<UnitLength>)?.converted(to: .meters).value ?? 0)
}
}
}
let value: Double = 10
let meters: Measurement<UnitLength> = .init(value: value, unit: .meters)
let feet = meters.converted(to: .feet)
let measurements = [meters,feet]
measurements.test() // [{value 10, unit "m"}, {value 32.80839895013123, unit "ft"}]
// note that it is pointless to sum different types of units
measurements.sum // 42.80839895013123
// you would need to cast every element to the appropriate unit type before calculating its sum
measurements.totalLengthInMeters // 20