Praktyczne przykłady bez frameworków interfejsu użytkownika
Pisz małe, użyteczne DSL bez interfejsu użytkownika: pliki konfiguracyjne, proste buildery zapytań, generatory tekstu/Markdownu oraz potoki walidacji z użyciem @resultBuilder .
Praktyczne przykłady bez frameworków interfejsu użytkownika to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 3 lekcji w sumie.
Konstruktory wyników niezwiązane z UI
Można tworzyć przydatne DSL-e do wielu zadań poza UI. Stworzymy konstruktory konfiguracji, zapytań, tekstu i walidacji. Każdy z nich powinien być niewielki i skupiony na jednym celu.
Konstruktor konfiguracji
Konstruktor konfiguracji zbiera proste krotki w słownik. Miejsca wywołań są uporządkowane i łatwe do przejrzenia.
@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")Konstruktor zapytań
Konstruktor zapytań łączy klauzule za pomocą AND. Obsługujemy if/else i pętle za pomocą mechanizmów konstruktora.
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)Konstruktor tekstu/Markdown
Konstruktor tekstu generuje pojedynczy String. Funkcje pomocnicze, takie jak h2 i bullet, pomagają zachować czytelność bloku.
@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)Konstruktor walidacji
Należy zebrać reguły walidacji, a następnie uruchomić je jako potok. Blok pozostaje deklaratywny; wykonanie następuje później.
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)Wskazówki projektowe
Wskazówki:
- Należy zacząć od buildBlock; dodawać either/array tylko wtedy, gdy są potrzebne.
- Należy utrzymywać proste typy generowanych wartości: String, tablice, niewielkie struktury.
- Należy udostępnić jedną funkcję wejściową dla każdego DSL-a (np. config, md).
- Należy udokumentować dozwolone instrukcje i zasady escapowania.
Zastosowanie konstruktora poza UI
Szybkie sprawdzenie: Wybierz dobre zastosowanie konstruktora niezwiązane z UI:
Podsumowanie
Podsumowanie: Konstruktory wyników świetnie sprawdzają się w przypadku ustrukturyzowanych danych wejściowych — konfiguracji, zapytań, tekstu i walidacji. Należy utrzymywać je w minimalnym zakresie, zapewniać ich czytelność i jasno ograniczać ich zastosowanie.
Często zadawane pytania
Czy lekcja „Praktyczne przykłady bez frameworków interfejsu użytkownika” jest bezpłatna?
Tak — pełny tekst „Praktyczne przykłady bez frameworków interfejsu użytkownika” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „Praktyczne przykłady bez frameworków interfejsu użytkownika”?
Pisz małe, użyteczne DSL bez interfejsu użytkownika: pliki konfiguracyjne, proste buildery zapytań, generatory tekstu/Markdownu oraz potoki walidacji z użyciem @resultBuilder . Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.
Ile czasu zajmuje lekcja „Praktyczne przykłady bez frameworków interfejsu użytkownika”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Tworzenie mini-DSL za pomocą result builders
- Zakresowe API i wzorce czytelności
- Praktyczne przykłady bez frameworków interfejsu użytkownika