OCUnitKit 0.1.1

OCUnitKit 0.1.1

测试已测试
Lang语言 SwiftSwift
许可 MIT
Released最新发布2016年3月
SPM支持 SPM

Otavio Cordeiro 维护。



OCUnitKit 0.1.1

UnitKit

(…) 例如,长度是一个 物理量。米是一个长度的单位,代表一个确定的预定长度。当你说 10 米(或 10 m)时,我们实际上是指 10 倍的预定长度,称为 – 维基百科

UnitKit 是一个用于在 Swift 中创建、转换和比较单位和物理量的简单框架。

它支持数量运算和比较,以及直接支持多个单位的单位转换。如果您需要 UnitKit 不支持的单位,随时提交 pull 请求。

从技术的角度来看,UnitKit 实现了 Martin Fowler 在本文中描述的 Quantity 模式。

数量运算

使用 UnitKit,您可以添加和减去数量,也可以通过标量乘以和除以数量。

在添加和减去数量的操作中,结果将具有第一个数量的相同单位。下面,结果是米,因为 5 米 是操作中的第一个数量。

let fiveMeters = Quantity(5, unit: Length.meter)
let tenInches = Quantity(10, unit: Length.inch)
let twoYards = Quantity(2, unit: Length.yard)

var result = fiveMeters + tenInches
// 5.254 m

result = fiveMeters + tenInches - twoYards
// 3.4252 m

result = 2 * fiveMeters
// 10.0 m

result = tenInches / 2
// 5.0 in

单位转换

单位转换尊重单位类别。不同单位类别之间的转换将导致编译错误。

换句话说,长度可以被转换为长度,面积转换为面积,依此类推。

let twoYards = Quantity(2, unit: Length.yard)
let result = twoYards.convertTo(Length.meter)
// 1.8288 m

数量比较

存在以下数量比较:>、>=、<、<=、== 和 ~==。

应使用 == 操作符来比较表示相同单位的物理量。

let tenMeters = Quantity(10, unit: Length.meter)
let anotherTenMeters = 2 * Quantity(5, unit: Length.meter)
let result = tenMeters == anotherTenMeters
// true

let tenMeters = Quantity(10, unit: Length.meter)
let fifteenMeters = 3 * Quantity(5, unit: Length.meter)
let result = tenMeters == fifteenMeters
// false

应使用 ~== 操作符来比较来自同一类别的物理量。

let speed_kph = Quantity(72, unit: kilometerPerHour)
let speed_mph = Quantity(44.7390837508948, unit: milePerHour)
let result = speed_kph ~== speed_mph
// true

扩展它

UnitKit的目标是实现这个维基百科页面上的大多数度量单位。目前,只实现了最常用的单位。

但UnitKit的设计允许自定义。可以扩展一个分类以添加新的单位,甚至创建带有自己单位的新的分类。

向现有分类中添加新单位

要扩展现有分类,创建一个包含新单位定义的扩展。例如

extension Volume {
    static let gole = Unit<Volume>(name: "gole de cerveja", symbol: "gol", ratio: 6e-1)
}

let umGole = Quantity(1, unit: Volume.gole)
let result = umGole.convertTo(Volume.liter)
// 0.6 l

向新分类中添加新单位

要创建一个新的分类,创建一个新的struct并为新分类实现单位定义。例如

struct Force {
    static let newton = Unit<Force>(name: "newton", symbol: "N", ratio: 1)
    static let poundForce = Unit<Force>(name: "pound force", symbol: "lbf", ratio: 4448e-3)
}

let force = Quantity(0.3, unit: Force.newton)
let result = force.convertTo(Force.poundForce)
// 0.0674460431654676 lbf

UnitKit中的单位列表

  • 面积
    • 英亩
    • 公亩
    • 公顷
    • 平方厘米
    • 平方分米
    • 平方英尺
    • 平方英寸
    • 平方公里
    • 平方米
    • 平方英里
    • 平方毫米
    • 平方码

  • 能量
    • 卡路里
    • 电子伏特
    • 英尺磅力
    • 英寸磅力
    • 焦耳
    • 千卡
    • 千克焦耳
    • 千瓦时
    • 兆焦耳
    • 牛顿米
    • 热量单位

    • 达因
    • 千克力
    • kip
    • 牛顿
    • 盎司力
    • 磅达
    • 磅力

  • 长度
    • Ångströms
    • 厘米
    • 英里
    • 英尺
    • 英里
    • 英寸
    • 千米
    • 微米
    • 密尔
    • 英里
    • 英里(海里)
    • 毫米

  • 压力
    • 大气压
    • 汞英寸
    • 水英寸
    • 千帕
    • 百帕
    • 水银毫米
    • 水毫米
    • 帕斯卡
    • 磅每平方英寸
    • Torr

  • 速度
    • 英尺每秒
    • 千米每小时
    • 千米每分钟
    • 每米每分钟
    • 每米每秒
    • 每小时英里
    • 每分钟英里

  • 时间
    • 世纪
    • 十年
    • 小时
    • 微秒
    • 毫秒
    • 分钟
    • 纳秒

  • 体积
    • 英亩英尺
    • 桶(石油)
    • 厘升
    • 立方厘米
    • 立方英尺
    • 立方英寸
    • 立方米
    • 立方码
    • 流动盎司(英国)
    • 流动盎司(美国)
    • 加仑(英国)
    • 加仑(美国)
    • 毫升
    • 品脱(英国)
    • 品脱(美国)
    • 夸脱(美国)

  • 重量
    • 等重
    • 千克
    • 毫克
    • 盎司
    • 斯通
    • 吨(英国制)
    • 吨(美国制)

贡献

想要贡献?太好了!

  1. 复制它。
  2. 创建一个分支(git checkout -b my_awesome_feature
  3. 提交你的更改(git commit -am "添加新酷特性"
  4. 确保你对新功能有测试
  5. 将分支推送到远程(git push origin my_awesome_feature
  6. 发起一个Pull Request
  7. 享受一杯美味的拿铁咖啡并等待

授权

版权©2016 Otavio Cordeiro。保留所有权利。

在此特此许可,任何人获得本软件和相关文档文件(“软件”)的副本后,可以无限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售该软件的副本,并允许软件提供者进行此类操作,前提是遵守以下条件:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何明确或隐含的保证,包括但不限于商销性、适用于特定目的和非侵权的保证。在任何情况下,作者或版权所有者不应对任何主张、损害或其他责任负责,无论是在合同行为、侵权行为还是其他行为中,源于、源于或与软件或软件的使用或其他使用方式有关。