0Pricing
Swift Academy · Lekcja

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

  1. Tworzenie mini-DSL za pomocą result builders
  2. Zakresowe API i wzorce czytelności
  3. Praktyczne przykłady bez frameworków interfejsu użytkownika
← Powrót do Swift Academy