Swift Academy · Lección

Macros de miembros adjuntas para reducir código repetitivo

Genere automáticamente init, CodingKeys o conformidades con Equatable mediante macros de miembros.

Lección 3 de 413 pasos

Macros de miembros adjuntas para reducir código repetitivo es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Descripción general de las macros de miembros

Una macro de miembros adjunta genera nuevos miembros (propiedades, métodos e inits) directamente en el tipo decorado.

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

Conformidad con MemberMacro

Implemente MemberMacro y devuelva un conjunto de DeclSyntax que represente los nuevos miembros.

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()"]
  }
}

Generación de init

Las macros de miembros pueden generar un inicializador personalizado y sustituir el init miembro a miembro cuando sea necesario.

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

Aspectos internos de la macro @Observable

La macro integrada @Observable de Swift usa macros de miembros para añadir infraestructura de observación a su clase.

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

Lectura del tipo decorado

Acceda a las propiedades del tipo decorado mediante el parámetro decl para generar miembros sensibles al contexto.

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

Extracción de propiedades almacenadas

Filtre la lista de miembros en busca de declaraciones de variables con patrones de propiedades almacenadas para guiar la generación de código.

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
}

Generación de Equatable a partir de los miembros

Una macro @AutoEquatable puede generar == comparando cada propiedad almacenada.

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

Combinación de macros de miembros y de conformidad

A menudo se combina MemberMacro con ConformanceMacro para añadir miembros y declarar la conformidad con el protocolo.

struct AutoEquatableMacro: MemberMacro, ConformanceMacro { ... }

Argumentos de atributos

Su macro puede aceptar argumentos que personalicen el código que genera.

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

Informes de errores de macros

Lance MacroExpansionError o emita diagnósticos cuando la macro se use incorrectamente.

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

Rendimiento de compilación

Como la expansión ocurre en tiempo de compilación, las macros de miembros no añaden ninguna sobrecarga en tiempo de ejecución y el código generado se puede almacenar en caché.

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

Comprobación rápida

¿A qué protocolo debe conformar una macro de miembros adjunta?

Resumen de la lección

Las macros de miembros (MemberMacro) generan propiedades almacenadas, propiedades calculadas e inicializadores para el tipo que decoran. Lea los miembros existentes del tipo para producir código sensible al contexto. Combínelas con ConformanceMacro para añadir también conformidades con protocolos.

Gratis para empezar

Aprende Swift con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
122
Lecciones
409

Preguntas frecuentes

¿La lección «Macros de miembros adjuntas para reducir código repetitivo» es gratis?

Sí — el texto completo de «Macros de miembros adjuntas para reducir código repetitivo» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Macros de miembros adjuntas para reducir código repetitivo»?

Genere automáticamente init, CodingKeys o conformidades con Equatable mediante macros de miembros. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Macros de miembros adjuntas para reducir código repetitivo»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Roles de macros: independientes frente a adjuntas
  2. Escritura de una macro de expresión independiente
  3. Macros de miembros adjuntas para reducir código repetitivo
  4. Pruebas y depuración de macros
← Volver a Swift Academy