Restrições recursivas e genéricos de ordem superior
Escreva restrições recursivas (por exemplo, sequências aninhadas) e funções genéricas de ordem superior que recebem closures/funções genéricas.
Restrições recursivas e genéricos de ordem superior é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 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.
O quê e por quê
Esta lição apresenta:
- Restrições recursivas: restrições em membros genéricos aninhados (por exemplo, Sequence de Sequence).
- Genéricos de ordem superior: funções genéricas que aceitam fechamentos/funções genéricos.
Sequências aninhadas (flatten)
Uma restrição recursiva clássica: exigimos C.Element: Sequence para poder iterar em dois níveis de profundidade.
// Works for any Collection whose elements are Sequences
func flatten<C: Collection>(_ c: C) -> [C.Element.Element]
where C.Element: Sequence {
var result: [C.Element.Element] = []
result.reserveCapacity(c.reduce(0) { $0 + ($1 as AnySequence<C.Element.Element>).underestimatedCount })
for inner in c {
for e in inner { result.append(e) }
}
return result
}
let nested = [[1,2], [3], [4,5]]
print(flatten(nested)) // [1,2,3,4,5]Mapeamento genérico aninhado
Aplicamos duas restrições: C: Collection e C.Element: Collection, o que permite chamar map em cada nível.
// Map over a two-level structure without fixing concrete types
func mapNested<C: Collection, R>(_ c: C, _ transform: (C.Element.Element) -> R) -> [[R]]
where C.Element: Collection {
return c.map { inner in inner.map(transform) }
}
let doubled = mapNested([[1,2],[3]], { $0 * 2 })
print(doubled) // [[2,4],[6]]compose(f,g)
Genéricos de ordem superior: a função é genérica sobre as próprias funções, criando fluxos reutilizáveis como compose.
// Compose two generic transforms that work on the same element type
func compose<A, B, C>(
_ f: @escaping (B) -> C,
_ g: @escaping (A) -> B
) -> (A) -> C {
{ a in f(g(a)) }
}
let toString: (Int) -> String = { "\\($0)" }
let length: (String) -> Int = { $0.count }
let intToLen = compose(length, toString)
print(intToLen(1234)) // 4Parâmetros de fechamento genéricos
O fechamento f também é um parâmetro genérico. Mantemos os tipos flexíveis por meio de restrições.
// A generic "transform each" that accepts ANY transform (generic in T/U)
func transformEach<T, U, C: Collection>(_ c: C, using f: (T) -> U) -> [U]
where C.Element == T {
var out: [U] = []
out.reserveCapacity(c.count)
for x in c { out.append(f(x)) }
return out
}
let words = ["swift","kit"]
print(transformEach(words, using: { $0.uppercased() })) // ["SWIFT","KIT"]Diretrizes
Dicas:
- Escreva as menores restrições necessárias (
Sequenceem vez deCollection). - Prefira cláusulas de restrição para obter legibilidade.
- Teste com vários tipos concretos para garantir a generalidade.
- Documente as suposições (por exemplo, ordem dos elementos e exclusividade).
Definição de genéricos de ordem superior
Verificação rápida: o que torna uma função uma função genérica de ordem superior?
Recapitulação
Recapitulação: use restrições recursivas (por exemplo, C.Element: Sequence) para trabalhar com genéricos aninhados; use genéricos de ordem superior para compor fluxos de funções reutilizáveis de forma clara.
Perguntas Frequentes
A aula “Restrições recursivas e genéricos de ordem superior” é grátis?
Sim — o texto completo de “Restrições recursivas e genéricos de ordem superior” é 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 “Restrições recursivas e genéricos de ordem superior”?
Escreva restrições recursivas (por exemplo, sequências aninhadas) e funções genéricas de ordem superior que recebem closures/funções genéricas. 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 2 de 3.
Quanto tempo leva a aula “Restrições recursivas e genéricos de ordem superior”?
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
- Conformidades condicionais
- Restrições recursivas e genéricos de ordem superior
- Cláusulas where em extensões