Macrocomenzi în Swift: @freestanding, @attached și Generare de Cod cu SwiftSyntax în Swift (iOS & macOS)

Ghid complet pentru sistemul de macrocomenzi introdus în Swift 5.9 și 6.0: diferența dintre macrocomenzi freestanding și attached, manipularea AST-ului prin SwiftSyntax și executarea în procese sandbox izolate la compilare.

Sintaxă Swift
@attached(member, names: named(...)) macro MyMacro() = #externalMacro(...) | #freestanding(expression)

Sistemul de macrocomenzi (Swift Macros), introdus în Swift 5.9 și maturizat în Swift 6, aduce metaprogramare sigură direct la momentul compilării. Spre deosebire de macrocomenzile textuale din C/C++ (care sunt simple înlocuiri brute de text predispuse la erori ascunse), macrocomenzile Swift operează direct pe arborele de sintaxă abstractă (AST – Abstract Syntax Tree) prin biblioteca oficială SwiftSyntax și sunt executate în procese separate sandbox, garantând că nu pot accesa rețeaua sau modifica fișiere de pe disc.

Clasificarea Macrocomenzilor Swift

Există două categorii fundamentale de macrocomenzi în Swift:

  • Freestanding Macros: Apar de sine stătătoare în cod și încep cu simbolul diez (#). Pot fi expression macros (generează o valoare, cum ar fi #URL("https://dexblog.ro") care validează URL-ul la compilare) sau declaration macros (generează una sau mai multe declarații complete).
  • Attached Macros: Decorează o declarație existentă (clasă, structură, funcție, proprietate) și încep cu simbolul arond (@). Pot genera membri noi (@attached(member)), accesorii getter/setter (@attached(accessor)), declarații conexe (@attached(peer)) sau extensii cu conformări la protocoale (@attached(extension)).
Definirea și Utilizarea unei Macrocomenzi Attached
// 1. Declararea semnăturii macrocomenzii în pachetul de interfață:
@attached(member, names: named(description))
public macro AutoDescribe() = #externalMacro(module: "MyMacrosPlugin", type: "AutoDescribeMacro")

// 2. Implementarea generatorului de cod în pluginul SwiftSyntax:
import SwiftSyntax
import SwiftSyntaxMacros

public struct AutoDescribeMacro: MemberMacro {
    public static func expansion(
        of node: AttributeSyntax,
        providingMembersOf declaration: some DeclGroupSyntax,
        in context: some MacroExpansionContext
    ) throws -> [DeclSyntax] {
        guard let structDecl = declaration.as(StructDeclSyntax.self) else {
            throw MacroExpansionErrorMessage("@AutoDescribe poate fi aplicat doar pe structuri!")
        }
        
        let desc = """
        public var description: String {
            return "Structura \(structDecl.name.text) generată automat la compilare."
        }
        """
        return [DeclSyntax(stringLiteral: desc)]
    }
}

// 3. Utilizarea macrocomenzii în codul aplicației:
@AutoDescribe
struct ServerConfig {
    let host: String
    let port: Int
}

let cfg = ServerConfig(host: "api.dexblog.ro", port: 443)
print(cfg.description) // Proprietatea generată transparent la compilare

Avantaje Cheie ale Macrocomenzilor Swift

Caracteristică Macrocomenzi Swift Macrocomenzi C Preprocessor (#define)
Verificare Tipuri Validare strictă a tipurilor de intrare și ieșire. Substituție oarbă de text fără verificare semantice.
Securitate & Izolare Rulare în sandbox securizat fără acces la sistemul de fișiere. Poate declanșa efecte colaterale severe în procesul de compilare.
Inspectabilitate în Xcode Comanda „Expand Macro” arată exact codul generat pe loc. Necesită inspecție manuală a output-ului din preprocesor (gcc -E).
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Macrocomenzi în Swift: @freestanding, @attached și Generare de Cod cu SwiftSyntax

Ai o nelămurire despre utilizarea comenzii Macrocomenzi în Swift: @freestanding, @attached și Generare de Cod cu SwiftSyntax sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.