iOS 10自定义测量单位实现:如何将米/秒转换为自定义单位?
实现自定义速度单位转换的完整方案
嘿,这个问题我刚好折腾过!iOS 10引入的Measurement框架确实强大,虽然写起来有点繁琐,但胜在能避免手动计算的错误。要添加苹果没提供的自定义速度单位,其实只需要几步就能搞定:
1. 扩展UnitSpeed添加自定义单位
首先,我们需要扩展UnitSpeed(因为速度属于这个度量分类),给它添加一个静态属性来定义我们的自定义单位。这里的关键是指定自定义单位与基准单位(米/秒)的转换系数:
import Foundation extension UnitSpeed { // 举个例子:假设我们要添加一个叫"foo/秒"的自定义单位,1米/秒 = 2 foo/秒 static let fooPerSecond = UnitSpeed( symbol: "foo/s", converter: UnitConverterLinear(coefficient: 2.0) ) }
symbol是自定义单位的显示符号,你可以根据需求改成自己需要的(比如"bar/min"之类的)UnitConverterLinear用于线性转换,coefficient表示1个基准单位(米/秒)等于多少个自定义单位。如果你的自定义单位和米/秒是非线性关系,还可以继承UnitConverter实现自定义转换逻辑,不过大部分场景线性转换就足够了。
2. 执行单位转换
有了自定义单位后,转换就非常简单了——直接用Measurement的converted(to:)方法,框架会自动帮你处理计算:
// 源数据:以米/秒为单位的速度值 let sourceSpeed = Measurement(value: 7.5, unit: UnitSpeed.metersPerSecond) // 转换为自定义单位 let customSpeed = sourceSpeed.converted(to: .fooPerSecond) print(customSpeed) // 输出:15 foo/s
完全不需要手动写7.5 * 2这种内联计算,既简洁又能避免出错,这正是Measurement框架的优势所在。
额外提示:本地化支持(可选)
如果你的App需要多语言适配,想要自定义单位的符号在不同语言下显示不同文本,可以结合NSLocalizedString来定义symbol:
static let fooPerSecond = UnitSpeed( symbol: NSLocalizedString("foo_per_second_symbol", comment: "Foo per second unit symbol"), converter: UnitConverterLinear(coefficient: 2.0) )
然后在Localizable.strings文件中添加对应的本地化字符串即可。
这样就完成了自定义单位的扩展和转换啦,完全符合苹果框架的扩展性设计思路~
内容的提问来源于stack exchange,提问作者Kelvin Lau
相关产品推荐
相关产品推荐

