Apple doc dit: Le casting de type est un moyen de vérifier le type d’une instance ou de traiter cette instance comme une superclasse ou une sous-classe différente d’un autre endroit dans sa propre hiérarchie de classes.La coulée de type

dans Swift est implémentée avec les opérateurs is et as. is est utilisé pour vérifier le type d’une valeur tandis que as est utilisé pour convertir une valeur en un type différent.

Considérons les classes suivantes LivingBeing et deux sous-classes de LivingBeing nommées Human et Animal.

Créez maintenant un tableau constant appelé livingBeingArray avec un objet de classe Animal et un objet de classe human. Quel est selon vous le type de ce tableau créé via l’inférence de type? Il sera de type .

Le vérificateur de type de Swift est capable de déduire que Human et Animal ont une superclasse commune de LivingBeing, et donc il déduit un type de pour le tableau livingBeingArray.

Les éléments stockés dans livingBeingArray sont toujours des instances Human et Animal en coulisses. Cependant, si vous parcourez le contenu de ce tableau, les éléments que vous recevez sont tapés comme LivingBeing, et non comme Human ou Animal. Afin de travailler avec eux en tant que type natif, vous devez vérifier leur type ou les réduire à un type différent.

Utilisez l’opérateur de vérification de type (is) pour vérifier si une instance est d’un certain type de sous-classe. L’opérateur de vérification de type renvoie true si l’instance est de ce type de sous-classe et false si ce n’est pas le cas.

Considérez le code suivant:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

Itérons les objets du tableau sur une boucle for.

for item in livingBeingArray {if item is Animal {print("item is of type Animal")// will get executed for first item} else if item is Human {print("item is of type Human")// will get executed for second item}}

Downcasting

Apple doc dit: Une constante ou une variable d’un certain type de classe peut en fait faire référence à une instance d’une sous-classe en coulisses. Lorsque vous croyez que c’est le cas, vous pouvez essayer de réduire le type de sous-classe avec un opérateur de fonte de type (as? ou as!).

Simplifions cela. Considérons le tableau livingBeingArray. Nous savons que le premier élément est de type Animal. Étant donné que le tableau contient un objet Animal et un objet Human, l’inférence de type décidera du type de tableau comme LivingBeing. Si nous essayons d’obtenir du contenu de ce tableau, il vous renverra un objet de type LivingBeing. Dans ce cas, nous pouvons essayer de le réduire après l’avoir récupéré dans le tableau.

Différence entre as? et comme!

Le Downcasting peut être effectué de deux manières:

  • Downcasting conditionnel (comme?).
  • Downcasting forcé (comme!).

La forme conditionnelle, as?, renvoie une valeur facultative du type auquel vous essayez de réduire. La forme forcée, as!, tente le downcast et déballe le résultat en une seule action composée.

Utilisez la forme conditionnelle de l’opérateur de type cast (as?) lorsque vous n’êtes pas sûr que le downcast réussira. Cette forme de l’opérateur retournera toujours une valeur optionnelle, et la valeur sera nil si le downcast n’était pas possible. Cela vous permet de vérifier un downcast réussi.

Utilisez la forme forcée de l’opérateur de type cast (as!) uniquement lorsque vous êtes sûr que le downcast réussira toujours. Cette forme de l’opérateur déclenchera une erreur d’exécution si vous essayez de rétrograder à un type de classe incorrect.

Ici, dans le scénario ci-dessus, puisque nous savons que le premier objet du tableau est de type Animal, nous pouvons utiliser le downcasting forcé.

let animalObj = livingBeingArray as! Animal //forced downcasting to Animallet humanObj = livingBeingArray as! Human //forced downcasting to Human

Mais la diffusion descendante forcée peut échouer si nous essayons de réduire le premier objet à un Human et le deuxième objet à un Animal. Dans ce cas, le résultat sera nil qu’un type normal ne peut pas gérer et le programme se bloquera.

let animalObj = livingBeingArray as! Human //error and crasheslet humanObj = livingBeingArray as! Animal //error and crashes

Dans ce scénario, où nous ne sommes pas sûrs si le casting réussit, nous devons utiliser le downcasting conditionnel as?.

let animalObj = livingBeingArray as? Human //nil..animalObj is of Human? (optional Human which is the type which we tried to downcast to)let humanObj = livingBeingArray as? Animal //nil..humanObj is of Animal? (optional Animal which is the type which we tried to downcast to)

Mais la downcasting conditionnelle du type correct réussit et renvoie le type optionnel correct auquel nous essayons de rétrograder.

let animalObj = livingBeingArray as? Animal // success, returns Animal?let humanObj = livingBeingArray as? Human // success, returns Human?

Diffusion ascendante

La diffusion ascendante de l’objet de la classe de base vers sa superclasse est également possible. Convertissons le animalObject créé par downcasting forcé vers la classe LivingBeing.

let animalObj = livingBeingArray as! Animal
let animalObjectAsLivingBeingObj = animalObj as LivingBeing

animalObjectAsLivingBeingObj est de type LivingBeing.

Type Casting pour Tout objet et tout objet

Swift fournit deux types spéciaux pour travailler avec des types non spécifiques:

  • Any peut représenter une instance de n’importe quel type, y compris les types de fonctions.
  • AnyObject peut représenter une instance de n’importe quel type de classe.

Source : Internet

Le mot clé ‘Any’ est utilisé pour représenter une instance appartenant à n’importe quel type, y compris les types de fonctions. Considérons un tableau de type Any qui peut accepter différents types de valeurs. Nous pouvons utiliser une instruction switch pour vérifier le type et effectuer une downcasting.

var groups = ()
groups.append(1.0)
groups.append(1)
groups.append("string")
for item in groups {
switch item {
case let anInt as Int:
print("\(item) is an int")
case let aDouble as Double:
print("\(item) is a double")
case let aString as String:
print("\(item) is a string")
default:
print("dunno")
}
}
/*
1.0 is a double
1 is an int
string is a string
C11lldb_expr_13Pop (has 1 child) is a Genre
*/

La downcasting forcée et conditionnelle ne fonctionnera pas dans un switch-case

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.