Swift Academy · Lektion

Praktiska exempel utan UI-ramverk

Skriv små, användbara DSL:er utan UI: konfigurationsfiler, enkla query builders, text-/Markdown-utmatning och valideringspipelines med @resultBuilder .

Lektion 3 av 38 steg

Praktiska exempel utan UI-ramverk är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 3 av 3. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 3 lektioner.

Result builders utanför UI

Du kan bygga användbara DSL:er för många uppgifter utöver UI. Vi skapar builders för konfiguration, frågor, text och validering. Håll varje builder liten och fokuserad.

Konfigurationsbuilder

En konfigurationsbuilder samlar enkla tupler i en ordbok. Anropsplatserna blir prydliga och lätta att överblicka.

@resultBuilder
struct ConfigBuilder {
    static func buildBlock(_ parts: (String,String)...) -> [String:String] {
        var dict: [String:String] = [:]
        for (k,v) in parts { dict[k] = v }
        return dict
    }
}
func config(@ConfigBuilder _ body: () -> [String:String]) -> [String:String] { body() }

// Use it:
let cfg = config {
    ("ENV", "debug")
    ("API_URL", "https://api.example.com")
    ("RETRY", "3")
}
print(cfg["API_URL"] ?? "missing")

Frågebuilder

En frågebuilder sammanfogar satser med AND. Vi stöder if/else och loopar via builderns krokar.

struct Where { let clauses: [String] }
@resultBuilder
struct WhereBuilder {
    static func buildBlock(_ parts: String...) -> Where { Where(clauses: parts) }
    static func buildArray(_ parts: [String]) -> Where { Where(clauses: parts) }
    static func buildEither(first: Where) -> Where { first }
    static func buildEither(second: Where) -> Where { second }
}
func whereClauses(@WhereBuilder _ body: () -> Where) -> Where { body() }

func select(_ table: String, where w: Where) -> String {
    let filter = w.clauses.isEmpty ? "" : " WHERE " + w.clauses.joined(separator: " AND ")
    return "SELECT * FROM \(table)\(filter);"
}

// Use:
let isProd = false
let q = select("users", where: whereClauses {
    "age > 18"
    if isProd { "status = 'active'" } else { "status <> 'deleted'" }
})
print(q)

Text-/Markdown-builder

En textbuilder genererar en enda String. Hjälpfunktioner som h2 och bullet håller blocket läsbart.

@resultBuilder
struct TextBuilder {
    static func buildBlock(_ parts: String...) -> String { parts.joined(separator: "\n") }
    static func buildEither(first: String) -> String { first }
    static func buildEither(second: String) -> String { second }
    static func buildArray(_ parts: [String]) -> String { parts.joined(separator: "\n") }
}
func md(@TextBuilder _ body: () -> String) -> String { body() }

func h2(_ s: String) -> String { "## " + s }
func bullet(_ s: String) -> String { "- " + s }

let doc = md {
    h2("Release Notes")
    bullet("Faster build")
    bullet("Smaller binary")
}
print(doc)

Valideringsbuilder

Samla valideringsregler och kör dem sedan som en pipeline. Blocket förblir deklarativt; körningen sker senare.

struct ValidationResult { let ok: Bool; let messages: [String] }

typealias Rule = (String) -> String?   // nil = OK; otherwise error message

@resultBuilder
struct RulesBuilder {
    static func buildBlock(_ parts: Rule...) -> [Rule] { parts }
    static func buildArray(_ parts: [[Rule]]) -> [Rule] { parts.flatMap { $0 } }
}
func rules(@RulesBuilder _ body: () -> [Rule]) -> [Rule] { body() }

func validate(_ input: String, with rules: [Rule]) -> ValidationResult {
    var msgs: [String] = []
    for r in rules { if let m = r(input) { msgs.append(m) } }
    return ValidationResult(ok: msgs.isEmpty, messages: msgs)
}

// Use:
let rs = rules {
    { $0.isEmpty ? "Must not be empty" : nil }
    { $0.count < 3 ? "Too short" : nil }
}
let out = validate("hi", with: rs)
print(out.ok, out.messages)

Designtips

Tips:

  • Börja med buildBlock; lägg till either/array endast när det behövs.
  • Håll de genererade typerna enkla: String, arrayer och små strukturer.
  • Erbjud en ingångsfunktion per DSL (t.ex. config, md).
  • Dokumentera tillåtna satser och regler för escapning.

Användningsfall för builder utanför UI

Snabb kontroll: Välj en bra användning av en builder utanför UI:

Sammanfattning

Sammanfattning: Result builders passar utmärkt för strukturerade indata – konfigurationer, frågor, text och validering. Håll dem minimala, läsbara och väl avgränsade.

Gratis att börja

Lär dig Swift med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
122
Lektioner
409

Vanliga frågor

Är lektionen ”Praktiska exempel utan UI-ramverk” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Praktiska exempel utan UI-ramverk”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 3 lektioner.

Vad lär jag mig i ”Praktiska exempel utan UI-ramverk”?

Skriv små, användbara DSL:er utan UI: konfigurationsfiler, enkla query builders, text-/Markdown-utmatning och valideringspipelines med @resultBuilder . Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Swift Academy?

Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 3.

Hur lång tid tar lektionen ”Praktiska exempel utan UI-ramverk”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Swift Academy-lektionen?

Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Bygga mini-DSL:er med result builders
  2. Omfattningsstyrda API:er och mönster för läsbarhet
  3. Praktiska exempel utan UI-ramverk
← Tillbaka till Swift Academy