Макросы, атрибуты и организация группы тестов
Вначале отвечу на вопрос из предыдущей главы:
«Почему атрибут @Test — это макрос и в чем тут разница» ?
Если мы применяем макрос по отношению к методу — это атрибут. Без применения — это тип данных, в нашем случае макрос.
@Test // применяем атрибут к функции
func example() {...}
Разница между атрибутом и макросом состоит в контексте.
Трейт — это способ добавить дополнительную информацию или поведение к типу данных или функции.
В следующих главах, я расскажу более подробно про использование макросов, а пока ознакомься с 2 основными видами макросов.
Немного о макросах и ключевых словах
Если ты не знаком с макросами, то я дам краткую справку.
Макросы — это инструмент метапрограммирования[1], который позволяет генерировать код на этапе компиляции. Они помогают уменьшить количество boilerplate-кода, упростить разработку и повысить читаемость программы. Макросы могут добавлять новые функции, свойства, методы или даже изменять существующие структуры данных. Более подробно в документации языка.
note
Boilerplate-код — это шаблонный код, который должен быть написан во многих местах с минимальными изменениями.
Существует 2 основных вида макросов:
- Freestanding macro — в контексте программирования и в целом, freestanding можно перевести как независимый макрос.
Это означает, что такой макрос не зависит от конкретного типа данных (функции или структуры). Он существует сам по себе и может быть вызван в любом месте кода.
В Swift такие макросы объявляют с помощью символа решетки #
:
func gatherInformation(about person: any Human, currentFn: String = #function) {
if person.age < 18 {
#warning("Человек не достиг совершеннолетнего возраста.")
}
print("Продолжаем выполнять метод: \(currentFn)")
// ...
}
В данном случае, если условие верное, то ты получишь предупреждение и конкретное сообщение во время компиляции.
Freestanding — это макрос, который используется независимо от других конструкций и вызывается напрямую в коде.
- Attached macro — можно перевести как прикрепленный макрос.
Attached означает, что макрос прикреплен к определенному типу данных, например, к классу, структуре, свойству или функции. Он не существует самостоятельно (как независимый макрос), а расширяет или модифицирует конкретное выражение.
В Swift такие макросы обычно вызываются с помощью символа @
:
@Observable
class ProfileData {
let network = NetworkProvider()
var user: UserProfile?
var avatar: NSImage?
// ...
}
Теперь, когда ты введен в курс дела, перейдем к детальном расмотрению основных макросов фреймворка Swift Testing.