Conversion conditionnelle avec as?
Tentez une conversion qui renvoie une valeur optionnelle en cas d’échec.
Conversion conditionnelle avec as? est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 2 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.
Conversion conditionnelle
L’opérateur de conversion conditionnelle as? tente une conversion descendante et renvoie une valeur optionnelle : la valeur encapsulée en cas de réussite, ou nil en cas d’échec.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let maybe = a as? Dog
print(maybe != nil)Le résultat est une valeur optionnelle
Comme la conversion peut échouer, le type du résultat est Dog? et non Dog. Vous devez déballer la valeur avant de l’utiliser.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let maybe: Dog? = a as? Dog
print(type(of: maybe))Déballer avec if let
La manière idiomatique d’utiliser as? consiste à l’intégrer dans une liaison if let, qui n’exécute le corps que lorsque la conversion réussit.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if let dog = a as? Dog {
print(dog.bark())
} else {
print("Not a dog")
}Une conversion échouée renvoie nil
Lorsque l’instance n’est pas du type cible, as? produit nil et le corps de if let est ignoré.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Cat(name: "Mia")
if let dog = a as? Dog {
print(dog.bark())
} else {
print("That is not a dog")
}Combiner avec guard let
Vous pouvez également utiliser guard let pour effectuer la conversion dès le début et quitter si elle échoue, tout en gardant le chemin de réussite sans indentation.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
func describe(_ a: Animal) {
guard let cat = a as? Cat else {
print("Not a cat")
return
}
print(cat.meow())
}
describe(Cat(name: "Mia"))
describe(Dog(name: "Rex"))Conversion conditionnelle dans les boucles
Parcourir un tableau mixte et convertir conditionnellement chaque élément est une manière claire de traiter différentes sous-classes en toute sécurité.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia"), Dog(name: "Buddy")]
for a in zoo {
if let dog = a as? Dog {
print(dog.bark())
}
}Effectuer un transtypage vers des protocoles
as? vérifie également la conformité à un protocole : il renvoie une valeur si l’instance est conforme au protocole, et nil dans le cas contraire.
protocol Greeter { func greet() -> String }
class Person: Greeter { func greet() -> String { return "Hi" } }
class Rock {}
let items: [Any] = [Person(), Rock()]
for item in items {
if let g = item as? Greeter { print(g.greet()) }
}Utiliser la coalescence de nil après une conversion
Vous pouvez associer as? à l’opérateur ?? pour fournir une valeur de remplacement lorsque la conversion échoue.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Cat(name: "Mia")
let sound = (a as? Dog)?.bark() ?? "unknown sound"
print(sound)Enchaîner les appels après une conversion optionnelle
L’enchaînement optionnel permet d’appeler une méthode sur le résultat de la conversion ; toute l’expression vaut nil si la conversion échoue.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let bark = (a as? Dog)?.bark()
print(bark as Any)Pourquoi privilégier la conversion conditionnelle
as? ne provoque jamais de plantage : une conversion échouée produit simplement nil. C’est donc le choix sûr par défaut pour les conversions descendantes.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let unknown: Animal = Cat(name: "Mia")
let result = unknown as? Dog
print("Crashes? No. Value is nil:", result == nil)Exemple récapitulatif de conversion conditionnelle
En pratique, détectez une sous-classe en toute sécurité, agissez sur celle-ci et prévoyez une solution de repli élégante dans le cas contraire.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
func sound(of a: Animal) -> String {
if let d = a as? Dog { return d.bark() }
if let c = a as? Cat { return c.meow() }
return "silence"
}
print(sound(of: Dog(name: "Rex")))
print(sound(of: Cat(name: "Mia")))Vérification rapide
Rappelez-vous le type de résultat d’une conversion conditionnelle.
Récapitulatif : conversion conditionnelle avec as?
Vous avez appris que as? effectue une conversion descendante sûre et renvoie une valeur optionnelle, que if let et guard let déballent le cas de réussite, et qu’elle ne provoque jamais de plantage, car un échec produit simplement nil, ce qui en fait l’opérateur de conversion descendante à privilégier.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let pets: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia")]
for p in pets {
if let d = p as? Dog { print(d.bark()) } else if let c = p as? Cat { print(c.meow()) }
}Questions Fréquemment Posées
La leçon « Conversion conditionnelle avec as? » est-elle gratuite ?
Oui — le texte complet de « Conversion conditionnelle avec as? » 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 « Conversion conditionnelle avec as? » ?
Tentez une conversion qui renvoie une valeur optionnelle en cas d’échec. 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 2 sur 4.
Combien de temps prend la leçon « Conversion conditionnelle avec as? » ?
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
- Bases de la conversion ascendante et descendante
- Conversion conditionnelle avec as?
- Conversion forcée avec as! et ses risques
- Vérification des types avec is