Exemplos práticos sem frameworks de interface
Escreva pequenas DSLs úteis sem interface: arquivos de configuração, construtores simples de consultas, emissores de texto/Markdown e pipelines de validação com @resultBuilder .
Exemplos práticos sem frameworks de interface é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 3 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 3 aulas no total.
Construtores de resultados fora da interface
Você pode criar DSLs úteis para muitas tarefas além da interface do usuário. Vamos criar construtores de config, consulta, texto e validação. Mantenha cada um pequeno e focado.
Construtor de config
Um construtor de config coleta tuplas simples em um dicionário. Os locais de chamada são organizados e fáceis de examinar.
@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")Construtor de consultas
Um construtor de consultas une cláusulas com AND. Oferecemos suporte a if/else e laços por meio de ganchos do construtor.
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)Construtor de texto/Markdown
Um construtor de texto emite uma única String. Auxiliares como h2 e bullet mantêm o bloco legível.
@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)Construtor de validação
Colete regras de validação e execute-as como um fluxo. O bloco permanece declarativo; a execução ocorre posteriormente.
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)Dicas de projeto
Dicas:
- Comece com buildBlock; adicione suporte a ramificações e coleções apenas quando necessário.
- Mantenha os tipos emitidos simples: cadeias de caracteres, matrizes, pequenas estruturas.
- Forneça uma função de entrada por DSL (por exemplo, config, md).
- Documente as instruções permitidas e as regras de escape.
Caso de uso de construtor fora da interface
Verificação rápida: Escolha um uso sólido de um construtor fora da interface:
Recapitulação
Recapitulação: Os construtores de resultados são excelentes para entradas estruturadas — configurações, consultas, texto e validação. Mantenha-os mínimos, legíveis e com escopo bem definido.
Perguntas Frequentes
A aula “Exemplos práticos sem frameworks de interface” é grátis?
Sim — o texto completo de “Exemplos práticos sem frameworks de interface” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 3 aulas no total.
O que vou aprender em “Exemplos práticos sem frameworks de interface”?
Escreva pequenas DSLs úteis sem interface: arquivos de configuração, construtores simples de consultas, emissores de texto/Markdown e pipelines de validação com @resultBuilder . Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 3.
Quanto tempo leva a aula “Exemplos práticos sem frameworks de interface”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Criando mini-DSLs com construtores de resultados
- APIs com escopo e padrões de legibilidade
- Exemplos práticos sem frameworks de interface