0Pricing
Swift Academy · Aula

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))  // 4

Parâ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 (Sequence em vez de Collection).
  • 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

  1. Conformidades condicionais
  2. Restrições recursivas e genéricos de ordem superior
  3. Cláusulas where em extensões
← Voltar para Swift Academy