【问题标题】:Custom measurement unit自定义测量单位
【发布时间】:2018-03-04 18:18:56
【问题描述】:

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

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)

虽然 Apple 支持许多开箱即用的单元,但我需要一个他们不支持的单元。然而,Apple 确实考虑到了可扩展性,引入新指标的方法之一是扩展 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)
}

【问题讨论】:

    标签: ios swift measurement


    【解决方案1】:

    由于转换不是线性的,您需要创建自己的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
    

    【讨论】:

    • 你打败了我 :) - 当然可以简化双分数,例如return coefficient/value
    • 从 iOS 15 有 UnitConverterLinear
    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2018-02-02
    • 2011-11-05
    • 2013-10-26
    • 2018-02-25
    相关资源
    最近更新 更多