Construção de Sequências Preguiçosas Personalizadas
Crie suas próprias sequências avaliadas de forma preguiçosa.
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] -- LazyMapSequenceUma 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 1Interrompendo 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:
.lazyproduz envoltórios deLazySequenceProtocol- Implemente
Sequence+IteratorProtocol;next()retornanilpara interromper - Use
sequence(first:next:)/sequence(state:next:)como construtores rápidos - Envolva em
AnySequencepara ocultar os tipos concretos
Curso concluído! Próximo: aprofundamento em closures.
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
- A Propriedade lazy
- map e filter Preguiçosos
- Compromissos entre Execução Preguiçosa e Ávida
- Construção de Sequências Preguiçosas Personalizadas