在 Swift (iOS/macOS) 中使用 YAML:Yams 库
YAML (YAML Ain't Markup Language) 是一种方便的数据序列化格式,常用于配置文件、依赖描述(例如 docker-compose.yml),以及需要可读且简洁数据结构的项目。在 Apple 生态系统中,有多个库可用于在 Swift 中处理 YAML,但最流行且最稳定的是 Yams——一个用纯 Swift 编写、快速且易于使用的库。
什么是 Yams?
Yams 是一个开源库,提供对 Swift 中 YAML 解析和序列化的完整支持。它与 iOS、macOS、tvOS 和 watchOS 兼容。Yams 支持 YAML 1.2 规范,并允许将 YAML 字符串转换为 Swift 结构(字典、数组、字符串、数字、布尔值),反之亦然。
Yams 的主要功能:
- 将 YAML 字符串解析为
Any(通常是[String: Any]或[Any])。 - 将 Swift 对象序列化回 YAML。
- 支持嵌套结构、数组、多文档。
- 错误处理并提供详细消息。
- 完全兼容 Swift Package Manager (SPM) 和 CocoaPods。
在项目中安装 Yams
您可以通过 Swift Package Manager(推荐)或 CocoaPods 安装 Yams。
通过 Swift Package Manager
- 在 Xcode 中选择 File → Add Packages。
- 粘贴仓库 URL:
https://github.com/jpsim/Yams.git - 选择版本(推荐最新稳定版)并点击 Add Package。
或者,在 Package.swift 中添加依赖:
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyProject", dependencies: [ .package(url: "https://github.com/jpsim/Yams.git", from: "5.0.0") ], targets: [ .target( name: "MyProject", dependencies: ["Yams"]) ])通过 CocoaPods
在您的 Podfile 中添加一行:
pod 'Yams', '~> 5.0'然后运行 pod install。
基本用法:解析 YAML
安装后,导入库并使用 Yams.load(yaml:) 解析字符串。
import Yams
let yamlString = """name: Swifttype: languageversions: - 5.5 - 5.6 - 5.7features: protocol_oriented: true value_semantics: true"""
do { if let data = try Yams.load(yaml: yamlString) as? [String: Any] { print("Name: \\(data["name"] ?? "")") print("Versions: \\(data["versions"] ?? [])") if let features = data["features"] as? [String: Bool] { print("Protocol oriented: \\(features["protocol_oriented"] ?? false)") } }} catch { print("YAML 解析错误:\\(error.localizedDescription)")}执行结果:
Name: SwiftVersions: [5.5, 5.6, 5.7]Protocol oriented: true将 Swift 对象序列化为 YAML
要进行反向转换,请使用 Yams.dump(object:):
import Yams
let dictionary: [String: Any] = [ "app": "MyApp", "version": 2.0, "features": ["dark_mode", "notifications"], "settings": [ "autosave": true, "timeout": 30 ]]
do { let yamlString = try Yams.dump(object: dictionary) print(yamlString)} catch { print("序列化错误:\\(error.localizedDescription)")}输出:
app: MyAppfeatures: - dark_mode - notificationssettings: autosave: true timeout: 30