Apple doc spune: turnarea de tip este o modalitate de a verifica tipul unei instanțe sau de a trata acea instanță ca o superclasă sau subclasă diferită de altundeva în propria ierarhie de clasă.

turnarea de tip în Swift este implementată cu operatorii is și as. is este folosit pentru a verifica tipul unei valori, în timp ce as este folosit pentru a arunca o valoare unui alt tip.

luați în considerare următoarele clase LivingBeing și două subclase de LivingBeing numite Human și Animal.

acum creați o matrice constantă numită livingBeingArray cu un obiect de clasă Animal și un obiect de clasă human. Ce credeți că tipul acestei matrice creat prin inferență de tip? Acesta va fi de tip .

verificatorul de tip Swift este capabil să deducă că Human și Animal au o superclasă comună de LivingBeing și astfel deduce un tip de pentru matricea livingBeingArray.

elementele stocate în livingBeingArray sunt încă Human și Animal instanțe în spatele scenei. Cu toate acestea, dacă iterați peste conținutul acestui tablou, elementele pe care le primiți înapoi sunt tastate ca LivingBeing și nu ca Human sau Animal. Pentru a lucra cu ei ca tipul lor nativ, aveți nevoie pentru a verifica tipul lor, sau downcast-le la un alt tip.

utilizați operatorul de verificare a tipului (is) pentru a verifica dacă o instanță este de un anumit tip de subclasă. Operatorul de verificare a tipului returnează true dacă instanța este de acel tip de subclasă și false dacă nu este.

luați în considerare următorul cod:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

să iterăm obiectele matrice într-o buclă 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 spune: o constantă sau variabilă a unui anumit tip de clasă se poate referi de fapt la o instanță a unei subclase din spatele scenei. În cazul în care credeți că acesta este cazul, puteți încerca să coborâți la tipul de subclasă cu un operator de tip cast (as? sau as!).

să simplificăm acest lucru. Luați în considerare matricea livingBeingArray . Știm că primul element este de tip Animal. Deoarece matrice conține un obiect Animal și un obiect Human, inferența tip va decide tipul matrice ca LivingBeing. Dacă încercăm să obținem conținut din această matrice, vă va returna un obiect de tip LivingBeing.în acest caz, putem încerca să-l coborâm după ce l-am preluat din matrice.

diferența dintre as? și cum!

Downcasting se poate face în două moduri:

  • Downcasting condiționată (ca?).
  • Downcasting forțată (ca!).

forma condițională, as?, returnează o valoare opțională de tipul pe care încercați să downcast la. Forma forțată, as!, încearcă căderea și forța-desface rezultatul ca o singură acțiune compusă.

utilizați forma condiționată a operatorului de tip cast (as?) atunci când nu sunteți sigur dacă downcast va reuși. Această formă a operatorului va returna întotdeauna o valoare opțională, iar valoarea va fi nil dacă scăderea nu a fost posibilă. Acest lucru vă permite să verificați pentru un downcast de succes.

utilizați forma forțată a operatorului de tip cast (as!) numai atunci când sunteți sigur că downcast va reuși întotdeauna. Această formă a operatorului va declanșa o eroare de rulare dacă încercați să reduceți la un tip de clasă incorect.

aici, în scenariul de mai sus, din moment ce știm că primul obiect din matrice este de tip Animal, putem folosi Downcasting forțată.

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

dar downcasting forțată poate eșua dacă încercăm să downcast primul obiect la un Humanși al doilea obiect la un Animal. În acest caz, rezultatul va fi nil pe care un tip normal nu îl poate gestiona și programul se va prăbuși.

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

în acest scenariu, în cazul în care nu suntem siguri dacă turnarea reușește, ar trebui să folosim downcasting condiționată 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)

dar downcasting condiționată de tipul corect reușește și returnează tipul opțional corect pe care încercăm să downcast la.

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

Upcasting

Upcasting de la obiectul clasei de bază la superclasa sa este de asemenea posibil. Să convertim animalObject creat de downcasting forțat înapoi la LivingBeing clasă.

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

animalObjectAsLivingBeingObj este de tip LivingBeing.

turnare tip pentru orice și Oriceobiect

Swift oferă două tipuri speciale pentru lucrul cu tipuri nespecifice:

  • Any poate reprezenta o instanță de orice tip, la toate, inclusiv tipuri de funcții.
  • AnyObject poate reprezenta o instanță de orice tip de clasă.

sursa: Internet

cuvântul cheie ‘Any’ este folosit pentru a reprezenta o instanță care aparține oricărui tip, inclusiv tipurilor de funcții. Luați în considerare o matrice de tip Any care poate accepta diferite tipuri de valori. Putem folosi o declarație comutator pentru a checl tipul și de a face 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
*/

Downcasting forțată și condiționată nu va funcționa într-un switch-case

Lasă un răspuns

Adresa ta de email nu va fi publicată.