一个基于 LibYAML 构建的快速且简洁的 YAML 解析器。
构建 Yams 需要 Xcode 14.0+ 或 Swift 5.7+ 工具链,并使用 Swift Package Manager 或 CMake 和 Ninja。
需要 CMake 3.17.2 或更高版本,以及 Ninja 1.9.0 或更高版本。
为非 Apple 平台构建时
cmake -B /path/to/build -G Ninja -S /path/to/yams -DCMAKE_BUILD_TYPE=Release -DFoundation_DIR=/path/to/foundation/build/cmake/modules
cmake --build /path/to/build
为 Apple 平台(macOS、iOS、tvOS、watchOS)构建时,无需单独构建 Foundation,因为它包含在 SDK 中
cmake -B /path/to/build -G Ninja -S /path/to/yams -DCMAKE_BUILD_TYPE=Release
cmake --build /path/to/build
将 .package(url: "https://github.com/jpsim/Yams.git", from: "5.1.3")
添加到您的 Package.swift
文件的 dependencies
中。
将 pod 'Yams'
添加到您的 Podfile
中。
将 github "jpsim/Yams"
添加到您的 Cartfile
中。
在您的 WORKSPACE 文件中
YAMS_GIT_SHA = "SOME_SHA"
http_archive(
name = "com_github_jpsim_yams",
urls = [
"https://github.com/jpsim/Yams/archive/%s.zip" % YAMS_GIT_SHA,
],
strip_prefix = "Yams-%s" % YAMS_GIT_SHA,
)
Yams 具有三组转换 API:一组用于 Codable
类型,另一组用于 Swift 标准库类型,第三组用于 Yams 原生表示。
Yams.Node
。YAMLEncoder.encode(_:)
从符合 Encodable
类型的实例生成 YAML String
。YAMLDecoder.decode(_:from:)
从 YAML String
或 Data
解码符合 Decodable
类型的实例。import Foundation
import Yams
struct S: Codable {
var p: String
}
let s = S(p: "test")
let encoder = YAMLEncoder()
let encodedYAML = try encoder.encode(s)
encodedYAML == """
p: test
"""
let decoder = YAMLDecoder()
let decoded = try decoder.decode(S.self, from: encodedYAML)
s.p == decoded.p
Yams.Node
表示的内容中,通过匹配正则表达式来推断的。JSONSerialization
创建的对象,或者如果输入已经是标准库类型(Any
、Dictionary
、Array
等)。Yams.dump(object:)
从 Swift 标准库类型的实例生成 YAML String
。Yams.load(yaml:)
从 YAML String
生成 Swift 标准库类型作为 Any
的实例。// [String: Any]
let dictionary: [String: Any] = ["key": "value"]
let mapYAML: String = try Yams.dump(object: dictionary)
mapYAML == """
key: value
"""
let loadedDictionary = try Yams.load(yaml: mapYAML) as? [String: Any]
// [Any]
let array: [Int] = [1, 2, 3]
let sequenceYAML: String = try Yams.dump(object: array)
sequenceYAML == """
- 1
- 2
- 3
"""
let loadedArray: [Int]? = try Yams.load(yaml: sequenceYAML) as? [Int]
// Any
let string = "string"
let scalarYAML: String = try Yams.dump(object: string)
scalarYAML == """
string
"""
let loadedString: String? = try Yams.load(yaml: scalarYAML) as? String
Yams.serialize(node:)
从 Node
的实例生成 YAML String
。Yams.compose(yaml:)
从 YAML String
生成 Node
的实例。var map: Yams.Node = [
"array": [
1, 2, 3
]
]
map.mapping?.style = .flow
map["array"]?.sequence?.style = .flow
let yaml = try Yams.serialize(node: map)
yaml == """
{array: [1, 2, 3]}
"""
let node = try Yams.compose(yaml: yaml)
map == node
当 Apple 的 Combine 框架可用时,YAMLDecoder
符合 TopLevelDecoder
协议,这允许它与 decode(type:decoder:)
运算符一起使用
import Combine
import Foundation
import Yams
func fetchBook(from url: URL) -> AnyPublisher<Book, Error> {
URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.decode(type: Book.self, decoder: YAMLDecoder())
.eraseToAnyPublisher()
}
Yams 和 libYAML 均已获得 MIT 许可。