Esempi pratici senza framework UI
Scriva piccole DSL utili senza UI: file di configurazione, semplici query builder, generatori di testo/Markdown e pipeline di convalida con @resultBuilder .
Esempi pratici senza framework UI è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 3 lezioni in totale.
Result builder non UI
È possibile creare DSL utili per molte attività oltre l'interfaccia utente. Costruiremo builder per configurazione, query, testo e validazione. Mantenga ciascuno piccolo e focalizzato.
Builder di configurazione
Un builder di configurazione raccoglie semplici tuple in un dizionario. I punti di chiamata sono ordinati e facili da analizzare.
@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")Builder di query
Un builder di query unisce le clausole con AND. Supportiamo if/else e i cicli tramite gli hook del builder.
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)Builder di testo/Markdown
Un builder di testo produce un unico String. Helper come h2 e bullet mantengono leggibile il blocco.
@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)Builder di validazione
Raccolga le regole di validazione e le esegua poi come una pipeline. Il blocco rimane dichiarativo; l'esecuzione avviene in un secondo momento.
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)Suggerimenti di progettazione
Suggerimenti:
- Inizi con buildBlock; aggiunga either/array solo quando servono.
- Mantenga semplici i tipi prodotti: String, array e struct di piccole dimensioni.
- Fornisca una funzione di ingresso per ogni DSL (ad esempio config, md).
- Documenti le istruzioni consentite e le regole di escape.
Caso d'uso di builder non UI
Verifica rapida: scelga un buon utilizzo non UI per un builder:
Riepilogo
Riepilogo: i result builder danno il meglio con input strutturati—configurazioni, query, testo e validazione. Li mantenga minimali, leggibili e con un ambito ben definito.
Domande Frequenti
La lezione «Esempi pratici senza framework UI» è gratuita?
Sì — il testo completo di «Esempi pratici senza framework UI» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 3 lezioni in totale.
Cosa imparerò in «Esempi pratici senza framework UI»?
Scriva piccole DSL utili senza UI: file di configurazione, semplici query builder, generatori di testo/Markdown e pipeline di convalida con @resultBuilder . Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 3.
Quanto tempo richiede la lezione «Esempi pratici senza framework UI»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Creare mini-DSL con i result builder
- API con ambito e pattern di leggibilità
- Esempi pratici senza framework UI