Продвинутая документация Swift: от автодока до генерации сайтов
Документирование кода — это не просто формальность, а инвестиция в будущее проекта. На начальном уровне достаточно комментариев вида ///. Однако для профессиональных iOS/macOS проектов требуется системный подход: автоматическая генерация, интеграция с Xcode, поддержка Markdown и создание полноценных сайтов документации. В этой статье мы разберём продвинутые техники документирования Swift-проектов, включая работу с Swift DocC, кастомные расширения и лучшие практики для команды.
1. Swift DocC: современный стандарт документации
Swift DocC (Documentation Compiler) — это инструмент, встроенный в Xcode 13+, который позволяет создавать документацию из комментариев в коде и дополнительных Markdown-файлов. Он генерирует статический HTML-сайт, который можно публиковать или просматривать в Xcode.
Базовый синтаксис для DocC использует тройной слеш /// или /** */:
/// Вычисляет площадь круга.
///
/// - Parameter radius: Радиус круга.
/// - Returns: Площадь круга.
/// - Throws: `InvalidArgumentError.negativeRadius` если радиус отрицательный.
///
/// # Example usage:
/// ```swift
/// let area = try calculateCircleArea(radius: 5.0)
/// print(area) // 78.5398...
/// ```
func calculateCircleArea(radius: Double) throws -> Double {
guard radius >= 0 else {
throw InvalidArgumentError.negativeRadius
}
return Double.pi * radius * radius
}
Ключевые возможности продвинутого DocC:
- Ссылки на другие символы: используйте
``MyClass``или<doc:MyFunction>для создания гиперссылок. - Категории и группы: разбивайте документацию на логические блоки с помощью
## Topics. - Визуальные материалы: вставляйте изображения и диаграммы через Markdown.
- Поддержка расширений: создавайте отдельные
.mdфайлы для статей, туториалов и API-справочников.
Для генерации сайта в Xcode выберите Product > Build Documentation. Для командной строки используйте:
xcrun docc convert Sources/YourPackage.docc \
--output-path ./docs \
--hosting-base-path /your-repo-name
2. Организация документации: структура и навигация
Продвинутая документация — это не просто набор комментариев. Это продуманная информационная архитектура. В DocC для этого используются каталоги документации (.docc).
Рекомендуемая структура папки Documentation.docc:
Documentation.docc/
├── YourPackage.md # Главная страница пакета
├── GettingStarted.md # Статья "Начало работы"
├── AdvancedUsage.md # Статья "Продвинутое использование"
├── Tutorials/ # Папка с туториалами
│ ├── BasicTutorial.tutorial
│ └── AdvancedTutorial.tutorial
└── Resources/ # Изображения, диаграммы
└── architecture.png
Пример главной страницы YourPackage.md:
# ``MySwiftLibrary``
Библиотека для работы с сетевыми запросами и кэшированием на iOS.
## Topics
### Основы
- <doc:GettingStarted>
- ``NetworkManager``
- ``CacheService``
### Продвинутые темы
- <doc:AdvancedUsage>
- ``RequestInterceptor``
### Обработка ошибок
- ``NetworkError``
- ``CacheError``
Такая структура позволяет пользователям быстро находить нужную информацию, а разработчикам — легко поддерживать документацию в актуальном состоянии.
3. Кастомные расширения и метаданные
Для сложных проектов стандартного DocC может не хватить. Продвинутые команды используют кастомные расширения:
- Документирование протоколов и associated types: обязательно указывайте требования к реализации.
- Семантические версии: добавляйте теги
@availableи@deprecatedс пояснениями. - Примеры с ожидаемым выводом: используйте блоки
```swiftс комментариями результата.
Пример документирования протокола с associated type:
/// Протокол для объектов, поддерживающих кэширование.
///
/// Используйте этот протокол, чтобы добавить возможность
/// сохранения и восстановления состояния.
///
/// - Warning: Не реализуйте этот протокол для классов,
/// которые не являются потокобезопасными.
protocol Cacheable {
/// Тип ключа для кэша.
associatedtype Key: Hashable
/// Сохраняет объект в кэш.
/// - Parameters:
/// - object: Объект для сохранения.
/// - key: Уникальный ключ.
/// - Throws: `CacheError.storageFull` если кэш переполнен.
func save(_ object: Self, forKey key: Key) throws
/// Восстанавливает объект из кэша.
/// - Parameter key: Ключ для поиска.
/// - Returns: Объект, если найден, иначе `nil`.
func load(forKey key: Key) -> Self?
}
Также полезно добавлять метаданные в документацию:
/// - Author: Иван Петров
/// - Copyright: © 2024 MyCompany
/// - Date: 2024-01-15
/// - Since: iOS 15.0, macOS 12.0
/// - Complexity: O(log n)
4. CI/CD и автоматическая генерация
В профессиональных проектах документация должна генерироваться автоматически при каждом пуше в репозиторий. Это гарантирует, что документация всегда актуальна.
Пример GitHub Actions workflow для генерации и публикации DocC на GitHub Pages:
name: Deploy Documentation
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Build Documentation
run: |
xcrun docc convert Sources/MyPackage.docc \
--output-path docs \
--hosting-base-path /my-repo
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.G