Swift Academy · Aula

Construção de Sequências Preguiçosas Personalizadas

Crie suas próprias sequências avaliadas de forma preguiçosa.

Aula 4 de 413 etapas

Construção de Sequências Preguiçosas Personalizadas é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. 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 4 aulas no total.

Por que usar avaliação preguiçosa personalizada

Além de map e filter, você pode criar suas próprias sequências avaliadas de forma preguiçosa para casos como geradores infinitos ou fluxos computados dispendiosos que devem ser executados sob demanda.

O tipo LazySequence

Chamar .lazy envolve uma coleção em um tipo que está em conformidade com LazySequenceProtocol. As operações adicionadas retornam mais envoltórios preguiçosos:

let view = [1, 2, 3].lazy
let mapped = view.map { $0 * 2 }
print(Array(mapped))  // [2, 4, 6]  -- LazyMapSequence

Uma sequência baseada em solicitação

Sequências personalizadas são baseadas em solicitações: cada chamada ao iterador calcula o próximo valor apenas quando solicitado. Aqui está um gerador de Fibonacci:

struct Fibonacci: Sequence, IteratorProtocol {
    var a = 0, b = 1
    mutating func next() -> Int? {
        let r = a
        (a, b) = (b, a + b)
        return r
    }
}
print(Array(Fibonacci().prefix(6)))  // [0, 1, 1, 2, 3, 5]

Infinita, consumida de forma preguiçosa

Como os valores são solicitados sob demanda, uma sequência infinita é segura desde que você obtenha uma fatia finita:

struct Naturals: Sequence, IteratorProtocol {
    var n = 1
    mutating func next() -> Int? { defer { n += 1 }; return n }
}
print(Array(Naturals().prefix(4)))  // [1, 2, 3, 4]

Conformidade com LazySequenceProtocol

Adotar LazySequenceProtocol permite que seu próprio tipo encadeie operações de forma preguiçosa com map/filter também:

struct Counter: Sequence, IteratorProtocol, LazySequenceProtocol {
    var n = 0; let limit: Int
    mutating func next() -> Int? {
        guard n < limit else { return nil }
        defer { n += 1 }
        return n
    }
}
print(Array(Counter(n: 0, limit: 3).map { $0 * 10 }))  // [0, 10, 20]

sequence(first:next:)

A biblioteca padrão oferece um construtor para sequências preguiçosas personalizadas sem um novo tipo:

let powers = sequence(first: 1) { $0 <= 16 ? $0 * 2 : nil }
print(Array(powers))  // [1, 2, 4, 8, 16, 32]

sequence(state:next:)

Mantenha um estado mais rico entre as etapas:

let fibs = sequence(state: (0, 1)) { (s: inout (Int, Int)) -> Int? in
    let r = s.0
    s = (s.1, s.0 + s.1)
    return r
}
print(Array(fibs.prefix(6)))  // [0, 1, 1, 2, 3, 5]

Envoltório AnySequence

Oculte o tipo concreto por trás de AnySequence ao expor uma API:

func evens(upTo n: Int) -> AnySequence<Int> {
    AnySequence((0...n).lazy.filter { $0 % 2 == 0 })
}
print(Array(evens(upTo: 8)))  // [0, 2, 4, 6, 8]

Fluxo computado de forma preguiçosa

Adie o trabalho dispendioso até que cada elemento seja realmente consumido:

let stream = (1...5).lazy.map { (n: Int) -> Int in
    print("computing \(n)")
    return n * n
}
print(stream.first!)  // computing 1, then 1

Interrompendo um gerador

Retorne nil de next() para encerrar a sequência corretamente:

let countdown = sequence(state: 3) { (s: inout Int) -> Int? in
    guard s > 0 else { return nil }
    defer { s -= 1 }
    return s
}
print(Array(countdown))  // [3, 2, 1]

Reunindo tudo

Combine um gerador personalizado com operadores preguiçosos para criar um fluxo sob demanda:

let primesIsh = sequence(first: 2) { $0 < 20 ? $0 + 1 : nil }
    .lazy
    .filter { n in (2..<n).allSatisfy { n % $0 != 0 } }
print(Array(primesIsh))  // [2, 3, 5, 7, 11, 13, 17, 19]

Verificação rápida

O que sinaliza o fim de uma sequência personalizada de IteratorProtocol?

Recapitulação

Você aprendeu sobre sequências preguiçosas personalizadas:

  • .lazy produz envoltórios de LazySequenceProtocol
  • Implemente Sequence + IteratorProtocol; next() retorna nil para interromper
  • Use sequence(first:next:) / sequence(state:next:) como construtores rápidos
  • Envolva em AnySequence para ocultar os tipos concretos

Curso concluído! Próximo: aprofundamento em closures.

Grátis para começar

Aprenda Swift com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
122
Aulas
409

Perguntas Frequentes

A aula “Construção de Sequências Preguiçosas Personalizadas” é grátis?

Sim — o texto completo de “Construção de Sequências Preguiçosas Personalizadas” é 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 4 aulas no total.

O que vou aprender em “Construção de Sequências Preguiçosas Personalizadas”?

Crie suas próprias sequências avaliadas de forma preguiçosa. 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 4 de 4.

Quanto tempo leva a aula “Construção de Sequências Preguiçosas Personalizadas”?

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. A Propriedade lazy
  2. map e filter Preguiçosos
  3. Compromissos entre Execução Preguiçosa e Ávida
  4. Construção de Sequências Preguiçosas Personalizadas
← Voltar para Swift Academy