You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:12:15