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)).
// 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). |
Întrebări & Exemple de Cod:
Macrocomenzi în Swift: @freestanding, @attached și Generare de Cod cu SwiftSyntaxAi o nelămurire despre utilizarea comenzii
Macrocomenzi în Swift: @freestanding, @attached și Generare de Cod cu SwiftSyntaxsau 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.