0Pricing
Swift Academy · Lezione

Pattern di type erasure (AnySequence/AnyIterator)

Utilizzi AnySequence e AnyIterator per nascondere i tipi concreti di sequenze e iteratori, così che le API possano restituire “una sequenza di T” senza esporre l'implementazione.

Pattern di type erasure (AnySequence/AnyIterator) è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 3 lezioni in totale.

Perché il type erasure?

Il type erasure nasconde i tipi concreti dietro un wrapper stabile. Con AnySequence / AnyIterator può restituire “una sequenza di elementi” senza esporre la struttura interna.

Il limite

Sequence ha un tipo associato (Element), quindi il protocollo senza specificazioni non può essere utilizzato come tipo concreto per un valore. È necessario un wrapper.

// Goal: return "some Sequence<Int>"
// This won't compile as a stored value type:
// let s: Sequence = [1,2,3]   // Protocol with associated types
// Instead, erase the type to AnySequence<Int>.

Wrapper AnySequence

AnySequence avvolge qualsiasi sequenza concreta (Array, Set o una sequenza personalizzata) ed espone un tipo uniforme come AnySequence<Int>.

// Build an AnySequence<Int> from an Array
let a = [1, 2, 3]
let seq1: AnySequence<Int> = AnySequence(a)
// Consume like any sequence
for x in seq1 { print(x, terminator: " ") }
print("")

Wrapper AnyIterator

AnyIterator avvolge una closure che produce elementi. Lo inserisca in AnySequence per esporre una sequenza completa.

// Create an AnyIterator<Int> by hand
var i = 0
let it = AnyIterator<Int> {
    // Return next number or nil to stop
    guard i < 3 else { return nil }
    defer { i += 1 }
    return i
}
let seq2 = AnySequence(it)
for x in seq2 { print(x, terminator: " ") }  // 0 1 2
print("")

Tipo restituito uniforme

Il type erasure consente a un'unica funzione di restituire implementazioni diverse attraverso un unico tipo restituito stabile, AnySequence<Int>.

// Return a sequence of Int without exposing concrete type
func numbers(flag: Bool) -> AnySequence<Int> {
    if flag {
        // Array-based
        return AnySequence([10, 20, 30])
    } else {
        // Lazy generated with AnyIterator
        var n = 1
        let it = AnyIterator<Int> {
            guard n <= 3 else { return nil }
            defer { n += 1 }
            return n * 100
        }
        return AnySequence(it)
    }
}

for x in numbers(flag: true)  { print(x, terminator: " ") }  // 10 20 30
print("")
for x in numbers(flag: false) { print(x, terminator: " ") }  // 100 200 300
print("")

Quando usarlo

Usi la type erasure quando:

  • Desidera nascondere i dettagli di implementazione di sequenze/iteratori.
  • Le API devono restituire lo stesso tipo indipendentemente dai rami interni.
  • I generici diventano troppo esposti ai confini dell'API.

Note: preferisca i generici per ottenere prestazioni e chiarezza all'interno dei moduli; usi AnySequence/AnyIterator ai confini quando necessario.

Scopo di AnySequence

Verifica rapida: che cosa le offre AnySequence<T>?

Riepilogo

Riepilogo: racchiuda sequenze/iteratori concreti in AnySequence / AnyIterator per cancellare i tipi e restituire “una sequenza di T” da API flessibili.

Domande Frequenti

La lezione «Pattern di type erasure (AnySequence/AnyIterator)» è gratuita?

Sì — il testo completo di «Pattern di type erasure (AnySequence/AnyIterator)» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 3 lezioni in totale.

Cosa imparerò in «Pattern di type erasure (AnySequence/AnyIterator)»?

Utilizzi AnySequence e AnyIterator per nascondere i tipi concreti di sequenze e iteratori, così che le API possano restituire “una sequenza di T” senza esporre l'implementazione. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Pattern di type erasure (AnySequence/AnyIterator)»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. associatedtype e protocolli generici
  2. Pattern di type erasure (AnySequence/AnyIterator)
  3. Quando usare gli existentials (any P) invece dei generics
← Torna a Swift Academy