Swift Academy · Урок

Присоединённые макросы членов для сокращения шаблонного кода

Автоматически создавайте init, CodingKeys или соответствие Equatable с помощью макросов членов.

Урок 3 из 413 шагов

«Присоединённые макросы членов для сокращения шаблонного кода» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Обзор макросов членов

Присоединённый макрос членов создаёт новые члены — свойства, методы и инициализаторы — непосредственно в типе, к которому он применяется.

@AddID
struct User { var name: String }
// After expansion:
// struct User { var name: String; var id = UUID() }

Соответствие MemberMacro

Реализуйте MemberMacro и верните массив DeclSyntax, представляющий новые члены.

import SwiftSyntaxMacros

struct AddIDMacro: MemberMacro {
  static func expansion(
    of node: AttributeSyntax,
    providingMembersOf decl: some DeclGroupSyntax,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    return ["var id = UUID()"]
  }
}

Создание инициализатора

Макросы членов могут создавать пользовательский инициализатор, при необходимости заменяя инициализатор по членам.

// Macro expansion returns:
[
  "init(name: String) { self.name = name; self.id = UUID() }"
]

Внутреннее устройство макроса @Observable

Встроенный в Swift @Observable использует макросы членов для добавления инфраструктуры наблюдения к вашему классу.

@Observable
class Counter {
  var count = 0
  // macro adds: _$observationRegistrar, access(), withMutation()
}

Чтение типа, к которому применяется макрос

Получайте доступ к свойствам типа, к которому применяется макрос, через параметр decl, чтобы создавать контекстно-зависимые члены.

if let structDecl = decl.as(StructDeclSyntax.self) {
  let members = structDecl.memberBlock.members
  // iterate to inspect stored properties
}

Извлечение хранимых свойств

Отфильтруйте список членов, оставив объявления переменных с шаблонами хранимых свойств, чтобы управлять генерацией кода.

let storedProps = members.compactMap { member -> VariableDeclSyntax? in
  guard let varDecl = member.decl.as(VariableDeclSyntax.self),
        varDecl.bindingSpecifier.tokenKind == .keyword(.var)
  else { return nil }
  return varDecl
}

Создание Equatable на основе членов

Макрос @AutoEquatable может создать ==, сравнив каждое хранимое свойство.

// Generated code:
static func == (lhs: User, rhs: User) -> Bool {
  lhs.name == rhs.name && lhs.id == rhs.id
}

Сочетание макросов членов и соответствия протоколам

Часто MemberMacro сочетают с ConformanceMacro, чтобы одновременно добавлять члены и объявлять соответствие протоколу.

struct AutoEquatableMacro: MemberMacro, ConformanceMacro { ... }

Аргументы атрибута

Ваш макрос может принимать аргументы, настраивающие создаваемый им код.

@Clamped(range: 0...100)
var score: Int = 50
// macro reads range from attribute node and generates clamping accessors

Отчёты об ошибках макроса

Выбросьте MacroExpansionError или создайте диагностические сообщения, если макрос используется неправильно.

guard decl.is(StructDeclSyntax.self) else {
  throw MacroError.message("@AddID can only be applied to structs")
}

Производительность сборки

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

// All generated members are emitted as source code
// and compiled normally — no reflection at runtime

Быстрая проверка

Какому протоколу должен соответствовать присоединённый макрос членов?

Итоги урока

Макросы членов (MemberMacro) создают хранимые свойства, вычисляемые свойства и инициализаторы для типа, к которому они применяются. Изучайте существующие члены типа, чтобы создавать контекстно-зависимый код. Сочетайте их с ConformanceMacro, чтобы также добавлять соответствия протоколам.

Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Присоединённые макросы членов для сокращения шаблонного кода» бесплатный?

Да — полный текст урока «Присоединённые макросы членов для сокращения шаблонного кода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Присоединённые макросы членов для сокращения шаблонного кода»?

Автоматически создавайте init, CodingKeys или соответствие Equatable с помощью макросов членов. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Присоединённые макросы членов для сокращения шаблонного кода»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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