Existentielles avec any et effacement de type
Utiliser any Protocol, comprendre le coût en performances et savoir quand préférer les génériques.
Existentielles avec any et effacement de type est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 3 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.
Qu’est-ce qu’un type existentiel ?
Un type existentiel encapsule toute valeur conforme à un protocole derrière une interface uniforme, résolue à l’exécution.
protocol Drawable { func draw() }
struct Line: Drawable { func draw() { print("Line") } }
let d: any Drawable = Line()
d.draw()Le mot-clé any
Swift 5.7 exige le mot-clé any devant les noms de protocoles utilisés comme types existentiels afin de rendre l’encapsulation explicite.
func render(_ shape: any Drawable) {
shape.draw()
}
render(Line())Coût des types existentiels
Les types existentiels utilisent une allocation sur le tas et une distribution dynamique, ce qui peut être plus lent que les génériques avec une distribution statique.
// Existential – dynamic dispatch, potential heap alloc
var shapes: [any Drawable] = [Line(), Line()]
// Generic – static dispatch, no boxing
func drawGeneric<T: Drawable>(_ s: T) { s.draw() }Problème des PAT et des types existentiels
Les protocoles avec des types associés (PAT) ne peuvent pas être utilisés comme existentiels nus sans effacement de type.
protocol Container { associatedtype Item }
// var c: any Container // Swift 5.7 allows with "any" but loses Item infoMotif d’effacement de type
Une enveloppe avec effacement de type encapsule un type concret derrière une structure, masquant ainsi le type concret.
struct AnyDrawable: Drawable {
private let _draw: () -> Void
init<D: Drawable>(_ d: D) { _draw = d.draw }
func draw() { _draw() }
}AnySequence et AnyPublisher
La bibliothèque standard de Swift et Combine fournissent des enveloppes avec effacement de type telles que AnySequence et AnyPublisher.
import Combine
let subject = PassthroughSubject<Int, Never>()
let pub: AnyPublisher<Int, Never> = subject.eraseToAnyPublisher()eraseToAnyPublisher()
eraseToAnyPublisher() masque la chaîne concrète de publication afin que les appelants ne dépendent que de AnyPublisher.
func fetch() -> AnyPublisher<String, Error> {
URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
.map { String(data: $0.data, encoding: .utf8) ?? "" }
.eraseToAnyPublisher()
}Quand utiliser les existentiels
Utilisez les existentiels pour les collections hétérogènes ou lorsque le type exact est inconnu à la compilation.
var widgets: [any Drawable] = [] // mixed concrete types OKPrivilégier les génériques aux existentiels
Lorsque cela est possible, remplacez les existentiels par des génériques afin de bénéficier d’une liaison statique et de meilleures performances.
// Prefer this:
func draw<T: Drawable>(_ item: T) { item.draw() }
// Over this:
func draw(_ item: any Drawable) { item.draw() }Ouverture des existentiels
Swift 5.7 et les versions ultérieures peuvent « ouvrir » un existentiel lors de l’appel d’une fonction générique, en extrayant automatiquement le type sous-jacent.
func drawGeneric<T: Drawable>(_ d: T) { d.draw() }
let d: any Drawable = Line()
drawGeneric(d) // compiler opens the existential automaticallyEffacement de types ou types opaques
L’effacement de type masque le type pour une utilisation hétérogène ; les types opaques préservent l’identité pour un type de retour unique et cohérent.
let erased: any Drawable = Line() // runtime type unknown
let opaque: some Drawable = Line() // compile-time fixed typeVérification rapide
Quel est le principal coût en matière de performances des types existentiels ?
Récapitulatif de la leçon
Les existentiels (any Protocol) permettent le polymorphisme à l’exécution, au prix d’une liaison dynamique. L’effacement de type encapsule les types concrets derrière une interface stable. Privilégiez les génériques pour les performances et utilisez les existentiels pour les collections hétérogènes.
Questions Fréquemment Posées
La leçon « Existentielles avec any et effacement de type » est-elle gratuite ?
Oui — le texte complet de « Existentielles avec any et effacement de type » 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 « Existentielles avec any et effacement de type » ?
Utiliser any Protocol, comprendre le coût en performances et savoir quand préférer les génériques. 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 3 sur 4.
Combien de temps prend la leçon « Existentielles avec any et effacement de type » ?
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
- Contraintes génériques et clauses where
- Types opaques avec le mot-clé some
- Existentielles avec any et effacement de type
- Types associés principaux et erreurs typées