Swift Academy · Leçon

Écrire une macro d’expression autonome

Implémenter une macro #stringify simple avec SwiftSyntax et MacroExpansion.

Leçon 2 sur 413 étapes

Écrire une macro d’expression autonome est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.

Configuration du projet

Les macros résident dans une cible distincte d’un paquet Swift de type .macro, qui utilise SwiftSyntax.

// Package.swift (excerpt)
.macro(
  name: "MyMacros",
  dependencies: [
    .product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
    .product(name: "SwiftCompilerPlugin", package: "swift-syntax")
  ]
)

Déclaration d’une macro

Déclarez la signature de la macro dans une cible de bibliothèque afin que les utilisateurs puissent l’appeler.

@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
  = #externalMacro(module: "MyMacros", type: "StringifyMacro")

Implémentation du type de macro

Implémentez la macro en vous conformant à ExpressionMacro et en renvoyant 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))"
  }
}

Enregistrer le plug-in

Créez un CompilerPlugin qui répertorie toutes les macros du paquet.

import SwiftCompilerPlugin

@main
struct MyPlugin: CompilerPlugin {
  let providingMacros: [Macro.Type] = [
    StringifyMacro.self
  ]
}

Utiliser la macro

Importez la bibliothèque de macros et appelez-la avec #stringify.

import MyMacros
let (value, source) = #stringify(2 + 3)
print(value)   // 5
print(source)  // "2 + 3"

Construction d’ExprSyntax

Les valeurs de retour sont construites par interpolation de chaînes dans ExprSyntax, en tirant parti de la sûreté de type de SwiftSyntax.

// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"

Accéder aux arguments de la macro

Les arguments sont accessibles via node.arguments, qui est une liste d’expressions étiquetées.

let args = node.arguments
for arg in args {
  print(arg.label?.text ?? "_", arg.expression)
}

Générer des diagnostics

Émettez des avertissements ou des erreurs du compilateur depuis les macros à l’aide du contexte d’expansion.

context.diagnose(Diagnostic(
  node: node,
  message: MyDiagnostic.missingArgument
))

Nœuds syntaxiques de SwiftSyntax

SwiftSyntax représente chaque construction du langage par un nœud syntaxique typé que vous pouvez inspecter et construire.

import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntax

Hygiène des macros

Les macros Swift sont hygiéniques par défaut : les noms générés n’entreront pas en collision avec ceux de la portée d’appel.

// Macro-generated variables get unique names internally
// preventing accidental shadowing in user code

Développer une macro dans Xcode

Cliquez avec le bouton droit sur un appel de macro dans Xcode, puis choisissez Développer la macro pour inspecter le code source généré.

#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")

Vérification rapide

À quel protocole l’implémentation d’une macro d’expression doit-elle se conformer ?

Récapitulatif de la leçon

Écrivez une macro d’expression autonome en la déclarant avec @freestanding(expression), en implémentant ExpressionMacro dans une cible .macro, en l’enregistrant via CompilerPlugin et en l’appelant avec #macroName().

Gratuit pour commencer

Apprends Swift avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
122
Leçons
409

Questions Fréquemment Posées

La leçon « Écrire une macro d’expression autonome » est-elle gratuite ?

Oui — le texte complet de « Écrire une macro d’expression autonome » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Écrire une macro d’expression autonome » ?

Implémenter une macro #stringify simple avec SwiftSyntax et MacroExpansion. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Écrire une macro d’expression autonome » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Rôles des macros : autonomes ou attachées
  2. Écrire une macro d’expression autonome
  3. Macros attachées aux membres pour réduire le code répétitif
  4. Tester et déboguer des macros
← Retour à Swift Academy