RRuleKit

RRuleKit 是一个 Swift 库,用于解析和格式化 RFC 5545 规范中定义的重复规则。该软件包的设计目标是高性能和低内存占用,它利用 Swift 强大的类型系统和 UnsafeBufferPointer 进行优化解析。


特性

该库提供对 RFC 5545 iCalendar 规范定义的重复规则的全面支持。

强制规则部分

可选规则部分

健壮的解析和格式化:


平台支持

RRuleKit 兼容以下平台

说明

RRuleKit 基于 Foundation.Calendar.RecurrenceRule,它是 Swift Foundation 的一部分,通过 swift-foundation PR #464 引入。 由于此依赖关系,RRuleKit 仅支持 Calendar.RecurrenceRule 可用的平台。


用法

解析 RFC 5545 重复规则字符串

您可以使用 RecurrenceRuleRFC5545FormatStyle 将符合 RFC 5545 的重复规则字符串解析为 Calendar.RecurrenceRule 实例。

示例

import Foundation
import RRuleKit

// Initialize the parser with the desired calendar (optional)
let parser = RecurrenceRuleRFC5545FormatStyle(calendar: .current)

do {
    let rfcString = "FREQ=MONTHLY;BYDAY=MO,TU;BYMONTH=1,6;COUNT=5"
    let recurrenceRule = try parser.parse(rfcString)

    print("Frequency: \(recurrenceRule.frequency)")
    print("End: \(recurrenceRule.end)")
    print("Months: \(recurrenceRule.months)")
    print("Weekdays: \(recurrenceRule.weekdays)")
} catch {
    print("Failed to parse the recurrence rule: \(error)")
}

将重复规则格式化为字符串

使用相同的 RecurrenceRuleRFC5545FormatStyleCalendar.RecurrenceRule 对象格式化回符合 RFC 5545 的字符串。

示例

let formatter = RecurrenceRuleRFC5545FormatStyle(calendar: .current)
let rrule = Calendar.RecurrenceRule(
    calendar: .current,
    frequency: .daily,
    interval: 2,
    end: .afterOccurrences(5),
    weekdays: [.every(.monday), .every(.wednesday)]
)
let result = formatter.format(rrule)
print(result) // Outputs: "FREQ=DAILY;INTERVAL=2;COUNT=5;BYDAY=MO,WE"

Calendar.RecurrenceRule.End 支持

该库包含对 Calendar.RecurrenceRule.End 中的 .afterOccurrences.afterDate 格式的支持。 但是,这些格式仅在以下平台版本上可用


关键的 RFC 5545 解析规则

验证

该库对每个键强制执行严格的验证,确保值落在 RFC 5545 标准指定的有效范围内。

例如

局限性

不支持 FREQ=SECONDLY,因为 Calendar.RecurrenceRule.Frequency 目前不包含此频率。 如果输入字符串指定 FREQ=SECONDLY,则该库将抛出错误。


测试

RRuleKit 包含一个广泛的测试套件,用于验证以下内容


安装

Swift Package Manager (SPM)

将以下依赖项添加到您的 Package.swift 文件

dependencies: [
    .package(url: "https://github.com/kubens/RRuleKit", from: "1.0.0")
]

然后,将 RRuleKit 添加到目标的依赖项中

.target(
    name: "YourTarget",
    dependencies: ["RRuleKit"]
)

许可

RRuleKit 在 MIT 许可证下发布。 有关更多详细信息,请参见 LICENSE 文件。

参考