自定义测量单位

8

iOS 10引入了几个用于量化测量的组件,例如:

let velocity = Measurement(value: 3, unit: UnitSpeed.metersPerSecond)

虽然冗长,但好处是您可以在不出错的情况下将其转换为任何其他单位:
// before
let velocityMetersPerSecond = 3.0
let velocityKilometersPerHour = velocityMetersPerSecond * 1000 / 60

// after
let velocityKilometersPerHour = velocity.converted(to: .kilometersPerHour)

尽管苹果公司的产品支持许多单位,但我需要的单位他们不支持。然而,苹果公司考虑到了可扩展性,引入新度量衡的一种方式是通过扩展Unit类:

extension UnitSpeed {
  static let furlongPerFornight = 
    UnitSpeed(symbol: "fur/ftn", converter: UnitConverterLinear(coefficient: 
      201.168 / 1209600.0)
}

我需要将源速度从meters/second转换为min/km。以下是转换的数学计算:

min / km = 1 / (m / s) * 1000 / 60

我遇到的问题是如何将源值的乘法逆(或倒数)表达为转换的一部分。以下是错误版本:

extension UnitSpeed {
  // still missing 1 / source value!
  static let minutesPerKilometer = UnitSpeed(symbol: "min/km",
    UnitConverterLinear(coefficient: 1000.0 / 60.0)
}
1个回答

12

由于转换并不是线性的,因此您需要创建自己的UnitConverter子类:

class UnitConverterInverse: UnitConverter {
    var coefficient: Double

    init(coefficient: Double) {
        self.coefficient = coefficient
    }

    override func baseUnitValue(fromValue value: Double) -> Double {
        return coefficient / value
    }

    override func value(fromBaseUnitValue baseUnitValue: Double) -> Double {
        return coefficient / baseUnitValue
    }
}

extension UnitSpeed {
    static let minutesPerKilometer = UnitSpeed(symbol: "min/km",
        converter: UnitConverterInverse(coefficient: 1000.0 / 60.0))
}

let velocity = Measurement(value: 60, unit: UnitSpeed.milesPerHour)

let velocity2 = velocity.converted(to: .minutesPerKilometer)

print(velocity2)
0.621371192237334 min/km

1
你比我先完成了 :) - 当然,我们可以简化双倍分数,例如 return coefficient/value - Martin R
从iOS 15开始,有UnitConverterLinear - Marina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接