Ответ
Да, активно использовал Sourcery — инструмент для метапрограммирования в Swift, который генерирует код на основе аннотаций в исходниках и шаблонов (Stencil).
Типичные сценарии применения:
- Автоматизация boilerplate-кода: Генерация реализаций протоколов
Equatable,Hashable,Codableдля моделей. - Моки для тестирования: Автоматическое создание мок-объектов, которые реализуют протоколы зависимостей, что упрощает unit-тестирование.
- Линтинг и проверки: Генерация кода для проверки, что все случаи в
enumобработаны вswitch. - Динамические шаблоны UI: Генерация кода для таблиц или коллекций на основе моделей данных.
Пример шаблона Sourcery (.stencil) для автоматической генерации Equatable:
// AutoEquatable.stencil
{% for type in types.structs|enum where type.implements.Equatable %}
// MARK: - AutoEquatable for {{ type.name }}
extension {{ type.name }}: Equatable {
static func ==(lhs: {{ type.name }}, rhs: {{ type.name }}) -> Bool {
{% for variable in type.storedVariables %}
guard lhs.{{ variable.name }} == rhs.{{ variable.name }} else { return false }
{% endfor %}
return true
}
}
{% endfor %}
Аннотация в исходном коде Swift, которая активирует шаблон:
// sourcery: AutoEquatable
struct User {
let id: Int
let name: String
var email: String?
}
Преимущества:
- Снижение рутинной работы и ошибок при написании повторяющегося кода.
- Единообразие сгенерированного кода по всему проекту.
- Упрощение рефакторинга — при изменении модели достаточно перегенерировать код.
Недостатки / сложности:
- Настройка в CI/CD: Генерацию нужно интегрировать в процесс сборки (например, как
Run Script Phaseв Xcode). - Отладка: Сложнее отследить источник ошибки, если она в сгенерированном коде. Необходимо проверять шаблоны и входные аннотации.
- Зависимость от инструмента: Добавляет ещё одну зависимость в проект.