Работа с YAML в Swift (iOS/macOS)
YAML (YAML Ain't Markup Language) — это удобный формат сериализации данных, широко применяемый для конфигурационных файлов, описания API и обмена данными. В экосистеме Swift для iOS и macOS доступно несколько надёжных библиотек, позволяющих парсить и генерировать YAML. В этой статье мы рассмотрим две самые популярные: Yams и YamlSwift. Вы узнаете, как установить их в проект, выполнить базовый парсинг, сериализацию и обработать возможные ошибки.
1. Обзор библиотек
Yams
Yams — это современная библиотека для работы с YAML, написанная полностью на Swift. Она поддерживает спецификацию YAML 1.2, включает в себя лексер, парсер и средства для сериализации. Yams активно поддерживается сообществом и отлично подходит для проектов, использующих Swift Package Manager или CocoaPods.
YamlSwift
YamlSwift — более лёгкая библиотека, которая также полностью написана на Swift. Она предоставляет минималистичный API для парсинга YAML-строк и файлов. 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:
# Для Yams
pod 'Yams'
# Для YamlSwift
pod 'YamlSwift'
Затем выполните pod install.
3. Парсинг YAML с помощью Yams
После установки импортируйте библиотеку в файл Swift:
import Yams
Базовый парсинг строки
Допустим, у нас есть YAML-строка с информацией о пользователе:
let yamlString = """
name: Иван Петров
age: 30
languages:
- 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)")
}
Парсинг из файла
Для загрузки YAML из файла в Bundle используйте:
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. Сериализация (создание YAML) с помощью Yams
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: 25
name: Анна Смирнова
skills:
- iOS
- macOS
- watchOS
5. Работа с YamlSwift
YamlSwift предоставляет ещё более простой API. Импортируйте библиотеку: