在 Swift (iOS/macOS) 中使用 YAML — Yams 和 YamlSwift 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Swift (iOS/macOS) 中使用 YAML



YAML(YAML Ain't Markup Language)是一种方便的数据序列化格式,广泛应用于配置文件、API 描述和数据交换。在 iOS 和 macOS 的 Swift 生态系统中,有多个可靠的库可用于解析和生成 YAML。在本文中,我们将介绍两个最流行的库:Yams 和 YamlSwift。您将学习如何将它们安装到项目中,执行基本的解析、序列化以及处理可能的错误。



1. 库概述



Yams

Yams 是一个用纯 Swift 编写的现代 YAML 处理库。它支持 YAML 1.2 规范,包含词法分析器、解析器和序列化工具。Yams 受到社区的积极维护,非常适合使用 Swift Package Manager 或 CocoaPods 的项目。



YamlSwift

YamlSwift 是一个更轻量的库,也完全用 Swift 编写。它提供了用于解析 YAML 字符串和文件的最小化 API。YamlSwift 非常适合不需要完整 YAML 功能支持的简单场景。



2. 安装



这两个库都可以通过 Swift Package Manager (SPM) 或 CocoaPods 安装。让我们看看这两种方式。



通过 Swift Package Manager 安装(推荐)

在 Xcode 中,打开 File → Add Packages 并粘贴仓库 URL:

  • Yams: https://github.com/jpsim/Yams.git
  • YamlSwift: https://github.com/behrang/YamlSwift.git

选择所需的版本(建议使用最新的稳定版本)并将包添加到您的 target。



通过 CocoaPods 安装

在您的 Podfile 中添加一行:

# 对于 Yamspod 'Yams'

# 对于 YamlSwiftpod 'YamlSwift'

然后执行 pod install。



3. 使用 Yams 解析 YAML



安装后,在 Swift 文件中导入库:

import Yams


基本字符串解析

假设我们有一个包含用户信息的 YAML 字符串:

let yamlString = """name: 伊万·彼得罗夫age: 30languages:  - Swift  - Python  - JavaScript"""

使用 Yams.load(yaml:) 函数进行解析:

do {    if let result = try Yams.load(yaml: yamlString) as? [String: Any] {        print("姓名: \\(result["name"] ?? "")")        print("年龄: \\(result["age"] ?? 0)")        if let languages = result["languages"] as? [String] {            print("语言: \\(languages.joined(separator: ", "))")        }    }} catch {    print("YAML 解析错误: \\(error.localizedDescription)")}


从文件解析

要从 Bundle 中的文件加载 YAML,请使用:

guard let filePath = Bundle.main.path(forResource: "config", ofType: "yaml"),      let yamlString = try? String(contentsOfFile: filePath, encoding: .utf8) else {    fatalError("未找到 config.yaml 文件")}

do { let config = try Yams.load(yaml: yamlString) as? [String: Any] // 使用 config} catch { print("错误: \\(error)")}


4. 使用 Yams 进行序列化(生成 YAML)



Yams 还允许将 Swift 对象转换回 YAML 字符串。使用 Yams.dump(object:) 函数:

let dictionary: [String: Any] = [    "name": "安娜·斯米尔诺娃",    "age": 25,    "skills": ["iOS", "macOS", "watchOS"]]

do { let yamlString = try Yams.dump(object: dictionary) print(yamlString)} catch { print("序列化错误: \\(error)")}

结果将如下所示:

age: 25name: 安娜·斯米尔诺娃skills:-                    

推荐