INISerialization

一个支持 INI 文件格式反序列化和序列化的软件包。支持一些基本的语法选项,包括带引号的字符串值、整数和布尔值、节以及空值。 大部分语法选项都是可配置的。在默认配置中,反序列化器只会识别非常有限的语法。在当前版本中,序列化器是不可配置的。

读取 INI 数据

该 API 的设计与 JSONSerialization 类似

let obj = INISerialization.iniObject(with: data)

可以有选择地指定数据编码;如果没有指定,将尝试自动检测 Unicode 编码。options: 参数可用于设置以下选项中的任意一个:

写入 INI 数据

同样,API 的设计旨在让 JSONSerialization 用户熟悉

let data = INISerialization.data(withIniObject: object)

可以有选择地指定数据的目标编码;默认值为 UTF-8。 虽然有一个可选的 options 参数,但目前没有为序列化到数据定义的选项。

使用公共 API,输出中键的顺序是未定义的,除非顶级键始终出现在任何节标题之前,而不管 Swift 的字典实现呈现它们的顺序如何。 将来,用于显式键排序的内部可用 API 可能会对外可见; 当前的实现没有这样做,因为当前的有序键 API 非常笨拙且语义不直观。

EncoderDecoder

提供了 Decoder 的实现,即 INIDecoder。 如果尝试解码数组或嵌套超过一层的字典,则会抛出错误,因为此包支持的 INI 语法不支持这些结构。

还提供了 Encoder 的实现,即 INIEncoder。 由于 Codable 协议的限制,如果尝试编码数组,则会发生致命错误。 与解码器一样,如果尝试嵌套字典超过一层,则会抛出错误。

一个简单的例子

struct SomeData: Codable {
    struct Subsection: Codable {
        let first_subkey: Bool
        let second_subkey: Double?
    }
    let a_key: String
    let b_key: Int?
    let some_section: Subsection
}

let sampleObject = SomeData(
    a_key: "hello there",
    b_key: -5,
    some_section: .init(
        first_subkey: false,
        second_subkey: 1.25
    )
)

let data = INIEncoder().encode(sampleObject)

print(String(data: data, encoding: .utf8)!)
/*
a_key = "hello there"
b_key = -5
[some_section]
first_subkey = false
second_subkey = 1.25
*/

let decodedSampleObject = INIDecoder().decode(SomeData.self, from: data)

print(decodedSampleObject)
/*
SomeData(
    a_key: "hello there",
    b_key: Optional(-5),
    some_section: main.SomeData.Subsection(
        first_subkey: false,
        second_subkey: Optional(1.25)
    )
)
*/