一个支持 INI 文件格式反序列化和序列化的软件包。支持一些基本的语法选项,包括带引号的字符串值、整数和布尔值、节以及空值。 大部分语法选项都是可配置的。在默认配置中,反序列化器只会识别非常有限的语法。在当前版本中,序列化器是不可配置的。
该 API 的设计与 JSONSerialization
类似
let obj = INISerialization.iniObject(with: data)
可以有选择地指定数据编码;如果没有指定,将尝试自动检测 Unicode 编码。options:
参数可用于设置以下选项中的任意一个:
.detectNumericValues
:整数和小数值将被检测并返回为 Int
和 Double
类型,而不是字符串。.detectSections
:将支持 [section]
语法,并将节返回为嵌套字典。.allowHashComments
:默认情况下,解析器只接受以 ;
开头的注释。此选项使 #
也成为有效的注释字符。.allowTrailingComments
:默认情况下,解析器仅接受出现在其自身行上的注释。此选项允许注释出现在一行上的任何其他有效语法结构之后。但是,请注意在值之后使用注释,因为结果可能模棱两可。.uppercaseKeys
和 .lowercaseKeys
:如果设置了这些选项,则会将所有键(包括节名称)分别规范化为大写或小写。 如果两者都设置,则小写始终优先。.detectBooleanValues
:布尔名称 “on”、“off”、“yes”、“no”、“true” 和 “false” 将在它们作为值的唯一内容出现时被检测到,并作为 Bool
类型而不是字符串返回。.allowMissingValues
:扩展语法,使得单独出现在一行上且没有 =
分隔符的键被视为具有空值,而不是语法错误。.allowSectionReset
:扩展节语法,使得节标题 []
将当前节重置为“顶”级。如果未同时设置 .detectSection
,则无效。同样,API 的设计旨在让 JSONSerialization
用户熟悉
let data = INISerialization.data(withIniObject: object)
可以有选择地指定数据的目标编码;默认值为 UTF-8。 虽然有一个可选的 options
参数,但目前没有为序列化到数据定义的选项。
使用公共 API,输出中键的顺序是未定义的,除非顶级键始终出现在任何节标题之前,而不管 Swift 的字典实现呈现它们的顺序如何。 将来,用于显式键排序的内部可用 API 可能会对外可见; 当前的实现没有这样做,因为当前的有序键 API 非常笨拙且语义不直观。
提供了 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)
)
)
*/