在Swift 3 中设置中长测量符号

Setting medium and long measurement symbols in Swift 3

在 Swift 中,当我创建自定义单位时,我只能定义一个符号。对于内置单元,可以有短、中和长单元。如何为自定义单位设置其他单位样式?

extension UnitEnergy {
    static let footPounds = UnitEnergy(symbol: "ft-lbs", converter: UnitConverterLinear(coefficient: 1))
}

var test = Measurement<UnitEnergy>( value: 10, unit: .footPounds)
var formatter = MeasurementFormatter()

formatter.locale = Locale(identifier: "es")

formatter.unitStyle = .short
print( formatter.string(from: test))

formatter.unitStyle = .medium
print( formatter.string(from: test))

formatter.unitStyle = .long
print( formatter.string(from: test))

formatter.unitOptions = .providedUnit

formatter.unitStyle = .short
print( formatter.string(from: test))

formatter.unitStyle = .medium
print( formatter.string(from: test))

formatter.unitStyle = .long
print( formatter.string(from: test))

输出:

10 J
10 J
10 julios
10 ft-lbs
10 ft-lbs
10 ft-lbs

简答 - 你不能。 API 不提供任何允许您为三种单位样式提供不同符号的工具。

对于自定义单位,MeasurementFormatter 只有定义自定义单位时使用的一个符号。

请记住,对于三种不同的单位样式,需要的不仅仅是三种不同的可能符号。您实际上需要三种不同的字符串格式,因为有些单位可能有 space 或其他标点符号,有些可能没有。有些可能出现在值之前,有些可能出现在值之后。

然后是单元本地化的问题。 Foundation 框架为所有支持的语言提供所有这些信息,因此 MeasurementFormatter 可以为所有预定义单元显示所有支持语言的所有三种单元样式。

由于 API 确实支持自定义单位但无法提供单位样式特定符号,我建议向 Apple 提交增强请求。

有同样的问题,如果有消息请告诉我。现在,我这样解决了:

extension MeasurementFormatter {
    func customString(from unit: Unit) -> String {
        guard self.unitStyle == .long else {  //I only needed .long but you get the idea
            return self.string(from: unit)
        }

        switch unit {
        case UnitEnergy.footPounds: return "foot-pounds"
        default: return self.string(from: unit)
    }
}