ios 如何同时维护公制和英制度量衡变量

wr98u20j  于 2023-08-08  发布在  iOS
关注(0)|答案(1)|浏览(135)

我正在寻找一个最佳实践,或标准/接受的方法处理在应用程序中的公制和英制测量。我有一个iOS应用程序,目前只在美国市场,但我想国际化,它为其他市场。其中一部分涉及处理公制和英制测量,并根据本地化或首选项覆盖显示正确的测量。
由于此应用程序是为旅行的人设计的,因此用户可能希望根据他们当前所在的国家/地区在一个系统和另一个系统之间切换,因此我需要管理这两组数据。
由于用户可以在任何一个系统中输入测量值,并希望在另一个系统中读取等效值,因此我需要某种方法来维护这两个系统。我的第一个想法是将所有测量值(长度、体积、质量、温度、压力)创建为元组,并在保存数据时计算丢失的部分。但是,由于这是我第一次同时处理两个测量系统,我想知道是否已经有一种处理此类数据类型的标准方法。

kpbwa7wx

kpbwa7wx1#

我建议使用Apple在Foundation框架中提供的Measurement API。这提供了一种封装测量单位和双精度值的方法,提供了一系列用于在不同单位之间进行比较和转换的方法。
距离测量的简单示例:

import Foundation

enum MeasurementSystem {
    case metric
    case imperial
}

class MeasurementManager {
    private var system: MeasurementSystem = .metric

    func changeSystem(to system: MeasurementSystem) {
        self.system = system
    }

    func getUserPreferredDistance(for distanceInMeters: Double) -> String {
        let measurement = Measurement(value: distanceInMeters, unit: UnitLength.meters)

        switch system {
        case .metric:
            let formatter = MeasurementFormatter()
            formatter.unitStyle = .short
            formatter.unitOptions = .providedUnit
            return formatter.string(from: measurement)
        case .imperial:
            let imperialMeasurement = measurement.converted(to: .miles)
            let formatter = MeasurementFormatter()
            formatter.unitStyle = .short
            formatter.unitOptions = .providedUnit
            return formatter.string(from: imperialMeasurement)
        }
    }
}

字符串
在上面的代码中:
1.我们有一个enumMeasurementSystem来表示我们将支持的单元系统:.metric.imperial

  1. MeasurementManager类存储用户对测量系统的当前首选项。changeSystem(to:)功能允许切换测量系统。
  2. getUserPreferredDistance(for:)函数接收以米为单位的距离,并从中创建一个Measurement对象,然后根据用户的首选系统,将该距离转换为适当的单位并将其格式化以供显示。
    您可以对其他类型的测量(体积、质量、温度等)重复类似的过程,并将用户的首选项存储在UserDefaults等持久性存储中,以备将来使用。
    通过这种方法,您可以利用Swift的内置功能来管理和转换单元,而不是重新发明轮子。

相关问题