Apple doc siger: Type casting er en måde at kontrollere typen af en forekomst eller at behandle denne forekomst som en anden superklasse eller underklasse fra et andet sted i sit eget klassehierarki.

Type støbning i hurtig implementeres med is og as operatørerne. is bruges til at kontrollere typen af en værdi, mens as bruges til at kaste en værdi til en anden type.

overvej følgende klasser LivingBeing og to underklasser af LivingBeing navngivet Human og Animal.

Opret nu et konstant array kaldet livingBeingArray med et Animal klasseobjekt og et human klasseobjekt. Hvad tror du, typen af dette array oprettet via type inferens? Det vil være af typen .

hurtig type checker er i stand til at udlede, at Human og Animal har en fælles superklasse på LivingBeing, og så udleder den en type for livingBeingArray arrayet.

de elementer, der er gemt i livingBeingArray, er stadig Human og Animal forekomster bag kulisserne. Men hvis du gentager indholdet af dette array, skrives de elementer, du modtager tilbage, som LivingBeing og ikke som Human eller Animal. For at arbejde med dem som deres oprindelige type skal du kontrollere deres type eller nedlægge dem til en anden type.

brug typekontroloperatoren (is) til at kontrollere, om en forekomst er af en bestemt underklassetype. Typekontroloperatoren returnerer true, hvis forekomsten er af den pågældende underklassetype, og false, hvis den ikke er det.

overvej følgende kode:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

lad os gentage array-objekterne over en for loop.

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}}

nedstøbning

Apple doc siger: en konstant eller variabel af en bestemt klassetype kan faktisk henvise til en forekomst af en underklasse bag kulisserne. Hvor du mener, at dette er tilfældet, kan du prøve at nedslå til underklassetypen med en type cast-operatør (as? eller as!).

lad os forenkle dette. Overvej arrayet livingBeingArray. Vi ved, at det første element er af typen Animal. Da array indeholder et Animal objekt og et Humanobjekt, bestemmer typen inferens array typen som LivingBeing. Hvis vi forsøger at få noget indhold fra dette array, vil det returnere dig et objekt af typen LivingBeing.i så fald kan vi forsøge at nedslå det efter at have hentet det fra arrayet.

forskel mellem as? og som!

nedstøbning kan udføres på to måder:

  • betinget nedcasting(som ?).
  • tvunget nedstøbning (som!).

den betingede formular, as?, returnerer en valgfri værdi af den type, du forsøger at nedslå til. Den tvungne form, as!, forsøger nedslået og force-pakker resultatet ud som en enkelt sammensat handling.

Brug den betingede form for typen cast operator (as?), når du ikke er sikker på, om nedslået vil lykkes. Denne form for operatøren vil altid returnere en valgfri værdi, og værdien vil være nil, hvis nedkastet ikke var muligt. Dette giver dig mulighed for at tjekke for en vellykket nedslået.

Brug kun den tvungne form af typen cast operator (as!), når du er sikker på, at den nedslåede altid vil lykkes. Denne form for operatøren udløser en runtime-fejl, hvis du forsøger at nedslå til en forkert klassetype.

her i ovenstående scenario, da vi ved, at det første objekt i arrayet er af typen dyr, kan vi bruge tvungen nedstøbning.

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

men tvungen nedkastning kan mislykkes, hvis vi forsøger at nedkaste det første objekt til en Humanog andet objekt til en Animal. I dette tilfælde vil resultatet være nil, som en normal type ikke kan håndtere, og programmet går ned.

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

i dette scenario, hvor vi ikke er sikre på, om støbningen lykkes, skal vi bruge den betingede nedstøbning 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)

men betinget nedcasting af den korrekte type lykkes og returnerer den korrekte valgfri type, som vi forsøger at nedslå til.

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

Upcasting

Upcasting fra basisklasseobjektet til dets superklasse er også muligt. Lad os konvertere animalObject oprettet ved tvungen nedstøbning tilbage til LivingBeing klassen.

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

animalObjectAsLivingBeingObj er af typen LivingBeing.

Type støbning til enhver og AnyObject

Hurtig giver to specielle typer til at arbejde med uspecifikke typer:

  • Any kan repræsentere en forekomst af enhver type overhovedet, herunder funktionstyper.
  • AnyObject kan repræsentere en forekomst af enhver klassetype.

kilde: Internet

nøgleordet ‘Any’ bruges til at repræsentere en forekomst, der tilhører enhver type inklusive funktionstyper. Overvej en række typer Any, som kan acceptere forskellige typer værdier. Vi kan bruge en omskiftererklæring til at kontrollere typen og gøre nedstøbning.

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
*/

tvungen og betinget nedcasting vil ikke arbejde i en switch-case

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.