罗马数字库 1.0.0

罗马数字库 1.0.0

Kyle Hughes维护。



  • Kyle Hughes

罗马数字库

CocoaPods Version Languages CocoaPods Platforms

Build Status codecov

Twitter

为Swift提供一流的罗马数字支持。

身在罗马,就像罗马人一样编写代码。

简介

使用此框架需要进行有意义的描述,需要理解罗马数字的含义。有关背景信息,可以在维基百科上找到。

功能

  • 为所有3999个标准罗马数字提供了常数。
  • 支持减法和加法记法。
  • 使用针对罗马数字优化的算法进行算术运算——无需整数计算!
  • 转换为和从流行类型(例如StringInt)。
  • 扩展实际应用(例如版权文本)。
  • 符合所有适用数字协议。

限制

固定数值范围

我们理解的罗马数字仅限于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.swiftdependencies

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 引用,因为这不符合框架的精神。

构造函数

提供了构造函数以将 IntString 转换为 RomanNumeral

print(RomanNumeral(from: 2409))     // Prints "MMCDIX"
print(RomanNumeral(from: "MMCDIX")) // Prints "MMCDIX"

我们还支持从 IntString 文字到 RomanNumeral 的转换,当可以推断出 RomanNumeral 类型时。

let numeralFromInt: RomanNumeral = 2409
let numeralFromString: RomanNumeral = "MMCDIX"

print(numeralFromInt)       // Prints "MMCDIX"
print(numeralFromString)    // Prints "MMCDIX"

属性

提供了实例级属性将 RomanNumeral 转换为 IntString 值。

print(MMCDIX.intValue)      // Prints "2409"
print(MMCDIX.stringValue)   // Prints "MMCDIX"

我们还提供了各种 *Convertible 协议,允许类型返回不同的自我表示的 RomanNumeralRomanNumeralSymbol

算术

由于遵循了《数字》协议,我们的系统支持(并需要)加减乘运算。我们使用算法,可以直接操作罗马数字符号,而不是进行将罗马数字转换为整数,再将整数转换回罗马数字的转换。

性能

对真实性的承诺确实会产生一些影响。

以下表格对比了在新的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 类型提供了一系列扩展,使常见操作更容易。

CalendarDateComponent 扩展

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"
}

IntString 扩展

我们使 IntString 符合 *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

my twitter