Swift Academy · Leçon

Créer des séquences différées personnalisées

Créez vos propres séquences évaluées de manière différée.

Leçon 4 sur 413 étapes

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]  -- LazyMapSequence

Une 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 1

Arrê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 :

  • .lazy produit des enveloppes LazySequenceProtocol
  • Implémentez Sequence et IteratorProtocol ; next() renvoie nil pour arrêter la séquence
  • Utilisez sequence(first:next:) / sequence(state:next:) comme générateurs rapides
  • Enveloppez la séquence dans AnySequence pour masquer les types concrets

Cours terminé ! Ensuite : approfondissement des fermetures.

Gratuit pour commencer

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

  1. La propriété lazy
  2. map et filter différés
  3. Compromis entre évaluation différée et immédiate
  4. Créer des séquences différées personnalisées
← Retour à Swift Academy