在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)
}
}
在 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)
}
}