Макросы, атрибуты и организация группы тестов

Вначале отвечу на вопрос из предыдущей главы:

«Почему атрибут @Test — это макрос и в чем тут разница» ?

Если мы применяем макрос по отношению к методу — это атрибут. Без применения — это тип данных, в нашем случае макрос.

@Test // применяем атрибут к функции
func example() {...}

Разница между атрибутом и макросом состоит в контексте.

Трейт — это способ добавить дополнительную информацию или поведение к типу данных или функции.

Trait справка

В следующих главах, я расскажу более подробно про использование макросов, а пока ознакомься с 2 основными видами макросов.

Немного о макросах и ключевых словах

Если ты не знаком с макросами, то я дам краткую справку.

Макросы — это инструмент метапрограммирования[1], который позволяет генерировать код на этапе компиляции. Они помогают уменьшить количество boilerplate-кода, упростить разработку и повысить читаемость программы. Макросы могут добавлять новые функции, свойства, методы или даже изменять существующие структуры данных. Более подробно в документации языка.

note

Boilerplate-код — это шаблонный код, который должен быть написан во многих местах с минимальными изменениями.

Существует 2 основных вида макросов:

  1. Freestanding macro — в контексте программирования и в целом, freestanding можно перевести как независимый макрос.

Это означает, что такой макрос не зависит от конкретного типа данных (функции или структуры). Он существует сам по себе и может быть вызван в любом месте кода.
В Swift такие макросы объявляют с помощью символа решетки #:

func gatherInformation(about person: any Human, currentFn: String = #function) {
    if person.age < 18 {
        #warning("Человек не достиг совершеннолетнего возраста.")
    }

    print("Продолжаем выполнять метод: \(currentFn)")
    // ...
}

В данном случае, если условие верное, то ты получишь предупреждение и конкретное сообщение во время компиляции.

Freestanding — это макрос, который используется независимо от других конструкций и вызывается напрямую в коде.

  1. Attached macro — можно перевести как прикрепленный макрос.

Attached означает, что макрос прикреплен к определенному типу данных, например, к классу, структуре, свойству или функции. Он не существует самостоятельно (как независимый макрос), а расширяет или модифицирует конкретное выражение.

В Swift такие макросы обычно вызываются с помощью символа @:

@Observable
class ProfileData {
    let network = NetworkProvider()

	var user: UserProfile?
	var avatar: NSImage?
    // ...
}

Теперь, когда ты введен в курс дела, перейдем к детальном расмотрению основных макросов фреймворка Swift Testing.


[1]Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода) либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).