Присоединённые макросы членов для сокращения шаблонного кода
Автоматически создавайте init, CodingKeys или соответствие Equatable с помощью макросов членов.
«Присоединённые макросы членов для сокращения шаблонного кода» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Роли макросов: автономные и присоединённые
- Написание автономного макроса-выражения
- Присоединённые макросы членов для сокращения шаблонного кода
- Тестирование и отладка макросов