罗马数字库
为Swift提供一流的罗马数字支持。
身在罗马,就像罗马人一样编写代码。
简介
使用此框架需要进行有意义的描述,需要理解罗马数字的含义。有关背景信息,可以在维基百科上找到。
功能
- 为所有3999个标准罗马数字提供了常数。
- 支持减法和加法记法。
- 使用针对罗马数字优化的算法进行算术运算——无需整数计算!
- 转换为和从流行类型(例如
String
,Int
)。 - 扩展实际应用(例如版权文本)。
- 符合所有适用数字协议。
限制
固定数值范围
我们理解的罗马数字仅限于1到3999之间的数值。没有0的概念。现代学者提出了扩展数值系统的概念以支持大于3999的数值,但我们不承认任何这些扩展,并谴责提出这些扩展的人为异端。
大多数程序不处理大于3999的数值,而且在格里高利历中,世界在3999年之后就不会存在了,所以没有必要担心。
iPhone型号名称
RomanNumeralKit不支持将“Xs”等最近iPhone型号名称转换成或转换成罗马数字。
要求
- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
- Xcode 10.2+
- Swift 5+
安装
CocoaPods
将RomanNumeralKit添加到您的Podfile
pod 'RomanNumeralKit', '~> 1.0`
请访问CocoaPods网站以获取有关CocoaPods的通用使用和安装说明。
Swift包管理器
将RomanNumeralKit添加到您的Package.swift
的dependencies
值
dependencies: [
.package(url: "https://github.com/kylehughes/RomanNumeralKit.git", from: "1.0")
]
使用
在需要使用该库的Swift文件顶部导入 RomanNumeralKit
。
import RomanNumeralKit
常量
提供从1到3,999的所有有效罗马数字的常量。除非您正在进行其他类型的转换,否则您通常不需要使用初始化器。
所有常量都可以通过它们的大写Unicode字符直接访问。
print(MMCDIX) // Prints "MMCDIX"
print(MMCDIX.symbols) // Prints "[M, M, C, D, I, X]"
XCTAssertEqual(MMCDIX, RomanNumeral(.M, .M, .C, .D, .I, .X)) // True
转换
我们提供了便利的机制来将 RomanNumeral
转换为以及从常见类型。
请注意,这些是真正的转换:RomanNumeral
实例的支持值是一系列计数字符。我们不保留 Int
引用,因为这不符合框架的精神。
构造函数
提供了构造函数以将 Int
和 String
转换为 RomanNumeral
。
print(RomanNumeral(from: 2409)) // Prints "MMCDIX"
print(RomanNumeral(from: "MMCDIX")) // Prints "MMCDIX"
我们还支持从 Int
和 String
文字到 RomanNumeral
的转换,当可以推断出 RomanNumeral
类型时。
let numeralFromInt: RomanNumeral = 2409
let numeralFromString: RomanNumeral = "MMCDIX"
print(numeralFromInt) // Prints "MMCDIX"
print(numeralFromString) // Prints "MMCDIX"
属性
提供了实例级属性将 RomanNumeral
转换为 Int
和 String
值。
print(MMCDIX.intValue) // Prints "2409"
print(MMCDIX.stringValue) // Prints "MMCDIX"
我们还提供了各种 *Convertible
协议,允许类型返回不同的自我表示的 RomanNumeral
和 RomanNumeralSymbol
。
算术
由于遵循了《数字》协议,我们的系统支持(并需要)加减乘运算。我们使用算法,可以直接操作罗马数字符号,而不是进行将罗马数字转换为整数,再将整数转换回罗马数字的转换。
性能
对真实性的承诺确实会产生一些影响。
以下表格对比了在新的MacBook Pro上进行整数算术操作和罗马数字算术操作的性能。
操作(100次) | 整数 |
罗马数字 |
% 慢 |
---|---|---|---|
加法 | 0.00000127秒 | 0.151秒 | 11,889,663.78% |
减法 | 0.00000151秒 | 0.0761秒 | 5,992,025.98% |
乘法 | 0.00000204秒 | 0.0575秒 | 4,527,459.06% |
应注意的是,这比古罗马任何人都快的算术速度快得多。谁能对进步提出异议呢?
版权文字
我们提供的最有用的功能是自动格式化版权文字。
print(MDCCLXXVI.copyrightText) // Prints "Copyright © MDCCLXXVI"
加法符号
本框架的默认符号为减法符号——即《罗马数字》实例所代表的意义。我们提供AdditiveRomanNumeral
结构体,用于以加法符号初始化数字。我们还支持两种符号之间的转换。
两种符号都实现了RomanNumeralProtocol
协议,并支持相同的一般接口。
let additiveNumeral = AdditiveNotation(.M, .M, .C, .C, .C, .C, .V, .I, .I, .I, .I)
print(additiveNumeral) // Prints "MMCCCCVIIII"
print(additiveNumeral.intValue) // Prints "2409"
XCTAssertEqual(additiveRomanNumeral.romanNumeral, MMCDIX) // True
XCTAssertEqual(MMCDIX.additiveRomanNumeral, additiveRomanNumeral) // True
扩展
我们为现有的 Swift 类型提供了一系列扩展,使常见操作更容易。
Calendar
和 DateComponent
扩展
Calendar
对象和它们生成的 DateComponents
能够将年份转换为 RomanNumeral
。
if let currentYear = Calendar.current.currentYearAsRomanNumeral {
print(currentYear) // Prints "MMXIX"
print(currentYear.intValue) // Prints "2019"
print(currentYear.copyrightText) // Prints "Copyright © MMXIX"
}
if let americasBirthYear = Calendar.current.yearAsRomanNumeral(fromDate: americasBirthDate) {
print(americasBirthYear) // Prints "MDCCLXXVI"
print(americasBirthYear.intValue) // Prints "1776"
print(americasBirthYear.copyrightText) // Prints "Copyright © MDCCLXXVI"
}
Int
和 String
扩展
我们使 Int
和 String
符合 *RomanNumeralConvertible
协议,以完善这些基础类型。
print(2409.romanNumeral) // Prints "MMCDIX"
print(2409.additiveRomanNumeral) // Prints "MMCCCCVIIII"
print("MMCDIX".romanNumeral) // Prints "MMCDIX"
print("MMCCCCVIIII".additiveRomanNumeral) // Prints "MMCCCCVIIII"
开发
预提交钩子
我们使用Komondor 安装预提交钩子以运行格式化和linting。以下命令应在克隆存储库后运行一次。
swift run komondor install
许可证
RomanNumeralKit
在 MIT 许可证下可用。
贡献者
Kyle Hughes