Написание автономного макроса-выражения
Реализуйте простой макрос #stringify с помощью SwiftSyntax и MacroExpansion.
«Написание автономного макроса-выражения» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Настройка проекта
Макросы находятся в отдельной цели пакета Swift типа .macro и используют SwiftSyntax.
// Package.swift (excerpt)
.macro(
name: "MyMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
)Объявление макроса
Объявите сигнатуру макроса в цели библиотеки, чтобы клиенты могли его вызывать.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")Реализация типа макроса
Реализуйте макрос, обеспечив соответствие ExpressionMacro и вернув значение ExprSyntax.
import SwiftSyntaxMacros
import SwiftSyntax
struct StringifyMacro: ExpressionMacro {
static func expansion(
of node: some FreestandingMacroExpansionSyntax,
in context: some MacroExpansionContext
) throws -> ExprSyntax {
guard let arg = node.arguments.first?.expression else {
throw MacroError.message("Need an argument")
}
return "(\(arg), \(literal: arg.description))"
}
}Регистрация плагина
Создайте CompilerPlugin, перечисляющий все макросы в пакете.
import SwiftCompilerPlugin
@main
struct MyPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
StringifyMacro.self
]
}Использование макроса
Импортируйте библиотеку макросов и вызовите макрос с помощью #stringify.
import MyMacros
let (value, source) = #stringify(2 + 3)
print(value) // 5
print(source) // "2 + 3"Создание ExprSyntax
Возвращаемые значения создаются с помощью интерполяции строк в ExprSyntax, используя типобезопасность SwiftSyntax.
// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"Доступ к аргументам макроса
Доступ к аргументам осуществляется через node.arguments, представляющий собой список выражений с метками.
let args = node.arguments
for arg in args {
print(arg.label?.text ?? "_", arg.expression)
}Создание диагностических сообщений
Создавайте предупреждения или ошибки компилятора из макросов с помощью контекста раскрытия.
context.diagnose(Diagnostic(
node: node,
message: MyDiagnostic.missingArgument
))Синтаксические узлы SwiftSyntax
SwiftSyntax представляет каждую конструкцию языка как типизированный синтаксический узел, который можно исследовать и создавать.
import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntaxГигиена макросов
Макросы Swift по умолчанию гигиеничны: сгенерированные имена не конфликтуют с именами в области видимости вызывающего кода.
// Macro-generated variables get unique names internally
// preventing accidental shadowing in user codeРаскрытие макросов в Xcode
Щёлкните правой кнопкой мыши любой вызов макроса в Xcode и выберите Раскрыть макрос, чтобы просмотреть созданный исходный код.
#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")Быстрая проверка
Какому протоколу должна соответствовать реализация макроса-выражения?
Итоги урока
Создайте автономный макрос-выражение следующим образом: объявите его с помощью @freestanding(expression), реализуйте ExpressionMacro в цели .macro, зарегистрируйте через CompilerPlugin и вызывайте с помощью #macroName().
Часто задаваемые вопросы
Урок «Написание автономного макроса-выражения» бесплатный?
Да — полный текст урока «Написание автономного макроса-выражения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Написание автономного макроса-выражения»?
Реализуйте простой макрос #stringify с помощью SwiftSyntax и MacroExpansion. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Написание автономного макроса-выражения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Роли макросов: автономные и присоединённые
- Написание автономного макроса-выражения
- Присоединённые макросы членов для сокращения шаблонного кода
- Тестирование и отладка макросов