Escritura de una macro de expresión independiente
Implemente una macro #stringify sencilla con SwiftSyntax y MacroExpansion.
Escritura de una macro de expresión independiente es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 2 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.
Configuración del proyecto
Las macros residen en un destino de paquete Swift independiente de tipo .macro y usan SwiftSyntax.
// Package.swift (excerpt)
.macro(
name: "MyMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
)Declaración de la macro
Declare la firma de la macro en un destino de biblioteca para que los clientes puedan llamarla.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")Implementación del tipo de macro
Implemente la macro conformando ExpressionMacro y devolviendo un 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))"
}
}Registro del plugin
Cree un CompilerPlugin que enumere todas las macros del paquete.
import SwiftCompilerPlugin
@main
struct MyPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
StringifyMacro.self
]
}Uso de la macro
Importe la biblioteca de macros y llámela con #stringify.
import MyMacros
let (value, source) = #stringify(2 + 3)
print(value) // 5
print(source) // "2 + 3"Construcción de ExprSyntax
Los valores de retorno se construyen mediante interpolación de cadenas en ExprSyntax, aprovechando la seguridad de tipos de SwiftSyntax.
// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"Acceso a los argumentos de la macro
Se accede a los argumentos mediante node.arguments, que es una lista de expresiones etiquetadas.
let args = node.arguments
for arg in args {
print(arg.label?.text ?? "_", arg.expression)
}Generación de diagnósticos
Emita advertencias o errores del compilador desde las macros mediante el contexto de expansión.
context.diagnose(Diagnostic(
node: node,
message: MyDiagnostic.missingArgument
))Nodos de sintaxis de SwiftSyntax
SwiftSyntax representa cada construcción del lenguaje como un nodo de sintaxis tipado que puede inspeccionar y construir.
import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntaxHigiene de macros
Las macros de Swift son higiénicas de forma predeterminada: los nombres generados no entrarán en conflicto con los nombres del ámbito desde el que se llama a la macro.
// Macro-generated variables get unique names internally
// preventing accidental shadowing in user codeExpansión en Xcode
Haga clic con el botón derecho en cualquier llamada a una macro en Xcode y seleccione Expandir macro para inspeccionar el código fuente generado.
#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")Comprobación rápida
¿A qué protocolo debe conformar una implementación de una macro de expresión?
Resumen de la lección
Escriba una macro de expresión independiente siguiendo estos pasos: declárela con @freestanding(expression), implemente ExpressionMacro en un destino .macro, regístrela mediante CompilerPlugin y llámela con #macroName().
Preguntas frecuentes
¿La lección «Escritura de una macro de expresión independiente» es gratis?
Sí — el texto completo de «Escritura de una macro de expresión independiente» 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 «Escritura de una macro de expresión independiente»?
Implemente una macro #stringify sencilla con SwiftSyntax y MacroExpansion. 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 2 de 4.
¿Cuánto tiempo toma la lección «Escritura de una macro de expresión independiente»?
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
- Roles de macros: independientes frente a adjuntas
- Escritura de una macro de expresión independiente
- Macros de miembros adjuntas para reducir código repetitivo
- Pruebas y depuración de macros