这组扩展使我们能够轻松解析持续时间值,如 XML 文档中所表示的,这些文档期望其持续时间值采用 标准的 xsd:duration 格式。
持续时间格式有很多种表示方式,这组扩展应该允许我们处理所有这些方式。它最有用的是集成到 XML 解析器中。它将从 String 实例中读取持续时间,并返回一个 DateComponents 实例,表示该 String 中的持续时间。您也可以反过来,获取 DateComponents 实例,并将其表示为格式正确的 xsd:duration String。
它应该适用于 osx、tvOS 和 iOS。它仅依赖于 Swift Foundation 库。
这需要 Swift 4.0 或以上版本(已通过 4.2 测试)。
这是一个简单的源文件;不是模块。
要使用它,只需将 RVS_ParseXMLDuration/RVS_ParseXMLDuration.swift 文件添加到您的项目中;将其复制到您想要的任何位置。
这将向 String 结构体和 DateComponents 结构体添加一个函数:asXMLDuration
。
String 变体将返回一个可选的 DateComponents 结果(已解析的字符串),DateComponents 变体将返回一个可选的 String(格式正确的 xsd:duration 字符串)。
所有其余内容都用于测试、验证和共享。
字符串的格式为 [\-]P[|0-9|*Y][|0-9|*M][|0-9|*D][T[|0-9|*H][|0-9|*M][|0-9|*[\.|0-9|*]S]]
第一个字符 **必须 ** 是一个 "P"
,任何负号必须 **位于 **"P"
之前。
任何时间(小时、分钟、秒),**必须 ** 以 "T"
开头。这要么开始时间,要么将其与日期分开。
例如,P2Y6M5DT12H35M30S
是 2 年、6 个月、5 天、12 小时、35 分钟和 30 秒。
就我们的目的而言,当未指定单位时,我们根本不会将其包含在 DateComponents 中。 如果指定了单位,但为零 (0),则我们在 DateComponents 中将该单位指定为零。
没什么可展示的,真的。该解析器非常容易使用。
从字符串解析
每个部分由一个或多个十进制数字组成,紧随其后的是“Y”(年)、“M”(月或分钟)、“D”(天)、“H”(小时)或“S”(秒)。 秒可以表示为小数。 所有其他数字都是整数。
let durationComponents1 = "P2Y6M5DT12H35M30.123S".asXMLDuration // DateComponents(year: 2, month: 6, day: 5, hour: 12, minute: 35, second: 30, nanosecond: 1230000000)
您可以拥有超过 59 分钟或 23 小时。
let durationComponents2 = "PT168H120M".asXMLDuration // DateComponents(hour: 168, minute: 120)
为了具有负持续时间,第一个字符必须是减号,并且结果中的所有组件都将为负数。
let durationComponents3 = "-P2M4DT10M5.23S".asXMLDuration // DateComponents(month: -2, day: -4, minute: -10, second: -5, nanosecond: -2300000000)
从 DateComponents 实例传递字符串
零(或未指定)的组件不包含在结果字符串中。
let durationString1 = DateComponents(year: 0, day: 1, hour: 1, minute: 0, second: 1, nanosecond: 0).asXMLDuration // "P1DT1H1S"
请注意,小数秒表示为秒和纳秒。
let durationString2 = DateComponents(year: 1, month: 1, day: 1, hour: 1, minute: 1, second: 1, nanosecond: 1000000000).asXMLDuration // "P1Y1M1DT1H1M1.1S"
为了指定负持续时间,所有组件都必须为负数。
let durationString3 = DateComponents(year: -1, month: -1, day: -1, hour: -1, minute: -1, second: -1, nanosecond: -1000000000).asXMLDuration // "-P1Y1M1DT1H1M1.1S"
在您的项目中使用 RVS_ParseXMLDuration 没有依赖项。 为了在模块项目中对其进行测试和运行,您应该使用 CocoaPods 安装 SwiftLint,尽管这不是必需的。 这 只是一个好习惯。
MIT 许可证
特此授予任何获得本软件和相关文档文件(“软件”)副本的人员免费许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向其提供软件的人员这样做,但须符合以下条件
上述版权声明和本许可声明应包含在本软件的所有副本或实质部分中。
本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和不侵权的保证。 在任何情况下,作者或版权持有者均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他方面,由软件或软件的使用或其他交易引起的或与之相关的责任。
The Great Rift Valley Software Company: https://riftvalleysoftware.com