Makroroller: freestanding vs. attached
Forstå #expression-makroer samt rollerne @attached peer/member/accessor.
Makroroller: freestanding vs. attached er en gratis Swift Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Swift Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Swift Academy-kurset indeholder 4 lektioner i alt.
Hvad er Swift-makroer?
Swift-makroer udvider kildekoden på kompileringstidspunktet og genererer standardkode automatisk uden ekstra omkostninger under kørsel.
// Macros are invoked with # (freestanding) or @ (attached)
#warning("Fix this later")
@Observable class Counter { var count = 0 }Fritstående udtryksmakroer
Fritstående udtryksmakroer begynder med # og producerer en værdi eller udfører en bivirkning.
// #stringify expands to a tuple of the value and its source string
let (val, src) = #stringify(1 + 2)
print(val, src) // 3, "1 + 2"Fritstående deklarationsmakroer
Fritstående deklarationsmakroer udsender nye deklarationer, for eksempel funktioner og variabler, på det sted, hvor de bruges.
// #makePair emits two variables
#makePair("point", x: 1, y: 2)
// expands to: let pointX = 1; let pointY = 2Tilknyttede medlemsmakroer
Tilknyttede @member-makroer tilføjer nye lagrede eller beregnede egenskaber, init eller metoder til den type, de er knyttet til.
@AddID
struct User { var name: String }
// Expands to: var id = UUID()Tilknyttede adgangsmakroer
Tilknyttede @accessor-makroer genererer get-/set-implementeringer for lagrede egenskaber.
struct Point {
@Clamped(0...100)
var x: Int = 0
// accessor macro generates get/set with clamping
}Tilknyttede sidestillede makroer
Sidestillede makroer tilføjer deklarationer ved siden af den deklaration, de er knyttet til.
class Service {
@AddAsync
func fetchSync(completion: @escaping (Data)->Void) { ... }
// peer macro adds: func fetch() async -> Data
}Tilknyttede overensstemmelsesmakroer
Overensstemmelsesmakroer tilføjer protokoloverensstemmelser og de nødvendige implementeringer til en type.
@EquatableByID
struct Product { var id: Int; var name: String }
// adds: extension Product: Equatable { ... }Tilknyttede udvidelsesmakroer
Udvidelsesmakroer genererer komplette udvidelsesblokke for en type, hvilket er nyttigt til at tilføje komplekse protokolimplementeringer.
@CustomCodable
struct Config { var host: String; var port: Int }
// adds: extension Config: Codable { custom encode/decode }Makroudvidelse sker på kompileringstidspunktet
Alle makroudvidelser sker under kompileringen – der er ingen omkostning under kørsel, og den udvidede kode er synlig i Xcode.
// Right-click macro usage in Xcode → "Expand Macro"
// to see the generated source codeDeklaration af en makro
Makroer deklareres i et separat makromål ved hjælp af attributten @freestanding eller @attached.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")Oversigt over makroroller
Fritstående: #expression, #declaration. Tilknyttede: @member, @accessor, @peer, @conformance, @extension.
// Freestanding
let result = #stringify(40 + 2)
// Attached
@Observable class Model { var count = 0 }Hurtigt tjek
Hvilken makrorolle tilføjer nye medlemmer, for eksempel egenskaber eller init, til den type, den udsmykker?
Opsummering af lektionen
Fritstående makroer (#name) producerer værdier eller deklarationer. Tilknyttede makroer (@name) udvider typer med medlemmer, adgangsmetoder, sidestillede deklarationer, protokoloverensstemmelser eller udvidelser. Al udvidelse sker på kompileringstidspunktet.
Lær Swift med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 122
- Lektioner
- 409
Ofte stillede spørgsmål
Er lektionen “Makroroller: freestanding vs. attached” gratis?
Ja — alle 3 lektioner i læringssporet Swift Academy, inklusive “Makroroller: freestanding vs. attached”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Swift Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Makroroller: freestanding vs. attached”?
Forstå #expression-makroer samt rollerne @attached peer/member/accessor. Du øver dig i Swift Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Swift Academy?
Der kræves ingen tidligere erfaring. Swift Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Makroroller: freestanding vs. attached”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Swift Academy-lektion?
Ja. Alle Swift Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Makroroller: freestanding vs. attached
- Skriv en freestanding expression-makro
- Attached member-makroer til mindre boilerplate
- Test og fejlfinding af makroer