从测量中获取本地化单位的值

Mic*_*ael 3 swift

我需要获得一个度量的国际化值。

let speed = Measurement(value: 15, unit: UnitSpeed.kilometersPerHour)
let formatter = MeasurementFormatter()
formatter.string(from: speed) // is "9.32 mph"
speed.converted(to: .milesPerHour).value // this is what I want, but I have to hardcode the unit I am converting to
Run Code Online (Sandbox Code Playgroud)

我可以在9.32不手动拆分字符串并强制转换的情况下获取值 ( ) 吗?对于您可以使用的温度,formatter.unitOptions = .temperatureWithoutUnit但这会停止转换,我仍然会得到一个字符串。

有没有类似speed.converted(to: default).value获取本地化测量值的方法?

mat*_*att 6

您真正想知道的是:用户使用的是什么测量系统?

答案与Measurement或MeasurementFormatter无关。答案来自 Locale。这就是 MeasurementFormatter 的工作原理。它咨询语言环境。你也可以!只需说if Locale.current.usesMetricSystem并根据结果进行操作。

  • @Ricardo – 请参阅下面我的回答,苹果公司认为英国使用不同的“测量系统”。所以 `usesMetricSystem` 是 true(长度和重量公制),但 `measurementSystem` 是“UK”(距离和速度使用英里)。华泰 (2认同)

CRD*_*CRD 6

我认为您所追求的是语言环境的测量系统。Mac 目前可以理解三种系统:公制、美国和英国。英国使用公制来表示长度和重量,但仍然使用英里/英里来表示道路距离和速度,因此这里是第三种选择——该usesMetricSystem物业仅支持true英国的两种选择和退货。

要在 Swift 中获取测量系统需要使用NSLocale,此扩展会将其添加到Locale:

extension Locale
{
   var measurementSystem : String?
   {
      return (self as NSLocale).object(forKey: NSLocale.Key.measurementSystem) as? String
   }
}
Run Code Online (Sandbox Code Playgroud)

为了增加“乐趣”,Apple 实际上并没有指定这个属性的值,他们给出了示例,但没有给出完整的定义。您可以在三个已知使用它们的语言环境中查询属性来获取已知的三个值,例如,您可以将以下内容添加到扩展名中:

   static let metricMeasurementSystem = Locale(identifier: "fr_FR").measurementSystem!
   static let usMeasurementSystem = Locale(identifier: "en_US").measurementSystem!
   static let ukMeasurementSystem = Locale(identifier: "en_UK").measurementSystem!
Run Code Online (Sandbox Code Playgroud)

当然,如果 Swift 确实支持它们,它可能会enum为可能性定义一个,你也可以这样做。

HTH

BTW:对于那些认为英国很尴尬的人来说,“美国”系统只在三个国家使用:美国、缅甸和利比里亚。