Créer des séquences différées personnalisées
Créez vos propres séquences évaluées de manière différée.
Créer des séquences différées personnalisées est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.
Pourquoi créer des séquences paresseuses personnalisées ?
Au-delà de map et filter, vous pouvez créer vos propres séquences évaluées paresseusement, par exemple pour des générateurs infinis ou des flux calculés coûteux qui doivent s’exécuter à la demande.
Le type LazySequence
L’appel à .lazy enveloppe une collection dans un type conforme à LazySequenceProtocol. Les opérations que vous ajoutez renvoient d’autres enveloppes paresseuses :
let view = [1, 2, 3].lazy
let mapped = view.map { $0 * 2 }
print(Array(mapped)) // [2, 4, 6] -- LazyMapSequenceUne séquence fondée sur la demande
Les séquences personnalisées sont fondées sur la demande : chaque appel à l’itérateur calcule la valeur suivante uniquement lorsqu’elle est demandée. Voici un générateur 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]Infini, consommé paresseusement
Comme les valeurs sont extraites à la demande, une séquence infinie est sûre tant que vous n’en prenez qu’une portion finie :
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]Adopter LazySequenceProtocol
Adopter LazySequenceProtocol permet également à votre propre type d’enchaîner paresseusement map/filter :
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]séquence(first:next:)
La bibliothèque standard fournit un générateur de séquences paresseuses personnalisées qui ne nécessite pas de nouveau type :
let powers = sequence(first: 1) { $0 <= 16 ? $0 * 2 : nil }
print(Array(powers)) // [1, 2, 4, 8, 16, 32]séquence(état:next:)
Conservez un état plus riche entre les étapes :
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]Enveloppe AnySequence
Masquez le type concret derrière AnySequence lorsque vous exposez une interface :
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]Flux calculé paresseusement
Différez le travail coûteux jusqu’à ce que chaque élément soit réellement consommé :
let stream = (1...5).lazy.map { (n: Int) -> Int in
print("computing \(n)")
return n * n
}
print(stream.first!) // computing 1, then 1Arrêter un générateur
Renvoyez nil depuis next() pour terminer proprement la séquence :
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]Assembler le tout
Combinez un générateur personnalisé avec des opérateurs paresseux pour créer une chaîne de traitement à la demande :
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]Vérification rapide
Qu’est-ce qui signale la fin d’une séquence personnalisée IteratorProtocol ?
Récapitulatif
Vous avez appris à créer des séquences paresseuses personnalisées :
.lazyproduit des enveloppesLazySequenceProtocol- Implémentez
SequenceetIteratorProtocol;next()renvoienilpour arrêter la séquence - Utilisez
sequence(first:next:)/sequence(state:next:)comme générateurs rapides - Enveloppez la séquence dans
AnySequencepour masquer les types concrets
Cours terminé ! Ensuite : approfondissement des fermetures.
Apprends Swift avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 122
- Leçons
- 409
Questions Fréquemment Posées
La leçon « Créer des séquences différées personnalisées » est-elle gratuite ?
Oui — le texte complet de « Créer des séquences différées personnalisées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Créer des séquences différées personnalisées » ?
Créez vos propres séquences évaluées de manière différée. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Swift Academy ?
Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Créer des séquences différées personnalisées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?
Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- La propriété lazy
- map et filter différés
- Compromis entre évaluation différée et immédiate
- Créer des séquences différées personnalisées