Apple doc sier: Type casting er en måte å sjekke typen av en forekomst, eller å behandle den forekomsten som en annen superklasse eller underklasse fra et annet sted i sitt eget klassehierarki.

type casting I Swift er implementert med operatørene is og as. is brukes til å kontrollere typen av en verdi mens as brukes til å kaste en verdi til en annen type.

Vurder følgende klasser LivingBeing og to underklasser av LivingBeing kalt Human og Animal.

opprett nå en konstant array kalt livingBeingArray med ett Animal klasseobjekt og ett human klasseobjekt. Hva tror du typen av denne arrayen opprettet via type inferens? Det vil være av typen .

Swifts typekontroll kan utlede at Human og Animal har en felles superklasse på LivingBeing, og så gir Den en type for livingBeingArray – arrayet.

elementene som er lagret i livingBeingArray, er fortsatt Human og Animal forekomster bak kulissene. Men hvis du itererer over innholdet i denne matrisen, skrives elementene du mottar tilbake som LivingBeing, og ikke som Human eller Animal. For å kunne jobbe med dem som deres opprinnelige type, må du sjekke deres type, eller nedkaste dem til en annen type.

Bruk operatoren type check (is) til å kontrollere om en forekomst er av en bestemt underklassetype. Type check-operatoren returnerer true hvis forekomsten er av den underklassetypen og false hvis den ikke er det.

Vurder følgende kode:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

La oss iterere arrayobjektene over en for sløyfe.

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 sier: en konstant eller variabel av en bestemt klassetype kan faktisk referere til en forekomst av en underklasse bak kulissene. Der du tror dette er tilfelle, kan du prøve å nedkaste til underklasse typen med en type cast operatør (as? eller as!).

la oss forenkle dette. Vurder matrisen livingBeingArray . Vi vet at det første elementet er av typen Animal . Siden array inneholder ett Animal – objekt og ett Human – objekt, bestemmer typen inferens arraytypen som LivingBeing. Hvis vi prøver å få noe innhold fra denne matrisen, vil det returnere deg et objekt av typen LivingBeing. I så fall kan vi prøve å nedkaste det etter å ha hentet det fra matrisen.

Forskjell mellom as? og som!

Downcasting kan gjøres på to måter:

  • Betinget downcasting(som?).
  • Tvunget downcasting (som!).

det betingede skjemaet, as?, returnerer en valgfri verdi av typen du prøver å nedkaste til. Tvunget form, as!, forsøker nedslått og kraft-pakker resultatet som en enkelt sammensatt handling.

Bruk betinget form av type cast operator (as?) når du ikke er sikker på om nedkastet vil lykkes. Denne formen for operatøren vil alltid returnere en valgfri verdi, og verdien vil være nil hvis nedkastet ikke var mulig. Dette gjør at du kan se etter en vellykket nedslått.

Bruk tvungen form av typen cast operator (as!) bare når du er sikker på at nedkastet alltid vil lykkes. Denne formen for operatøren vil utløse en kjøretidsfeil hvis du prøver å nedkaste til en feil klassetype.

her i scenariet ovenfor, siden vi vet at det første objektet i arrayet er Av Typen Dyr, kan Vi bruke Tvunget downcasting.

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

men tvunget downcasting kan mislykkes hvis vi prøver å nedkaste det første objektet til en Human og andre objekt til en Animal. I dette tilfellet blir resultatet nil som en vanlig type ikke kan håndtere og programmet vil krasje.

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

i dette scenariet, der vi ikke er sikre på om støpingen lykkes, bør vi bruke betinget downcasting 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 downcasting av riktig type lykkes og returnerer den riktige valgfrie typen som vi prøver å nedkaste til.

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

Upcasting

Upcasting fra grunnklasseobjektet til superklassen er også mulig. La oss konvertere animalObject opprettet av tvunget downcasting tilbake til LivingBeing – klassen.

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

animalObjectAsLivingBeingObj er av typen LivingBeing .

Type Casting For Any Og AnyObject

Swift gir to spesielle typer for å jobbe med ikke-spesifikke typer:

  • Any kan representere en forekomst av enhver type i det hele tatt, inkludert funksjonstyper.
  • AnyObject kan representere en forekomst av hvilken som helst klassetype.

Kilde: Internett

søkeordet ‘Any’ brukes til å representere en forekomst som tilhører alle typer, inkludert funksjonstyper. Vurder en rekke typer Any som kan godta forskjellige typer verdier. Vi kan bruke en switch-setning for å sjekke typen og gjøre 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
*/

Tvunget og betinget downcasting vil ikke fungere i en switch-case

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.