0Pricing
Swift Academy · Урок

Написание автономного макроса-выражения

Реализуйте простой макрос #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 — локальная установка не требуется.

Все уроки этого курса

  1. Роли макросов: автономные и присоединённые
  2. Написание автономного макроса-выражения
  3. Присоединённые макросы членов для сокращения шаблонного кода
  4. Тестирование и отладка макросов
← Назад к Swift Academy