Apple doc sanoo: Type casting on tapa tarkistaa instanssin tyyppi tai käsitellä kyseistä instanssia erilaisena superluokkana tai alaluokkana kuin jossain muualla omassa luokkahierarkiassaan.

Swiftin Tyyppivalu toteutetaan is ja as – operaattoreilla. is käytetään arvon tyypin tarkistamiseen, kun taas as käytetään arvon valamiseen toiselle tyypille.

tarkastellaan seuraavia luokkia LivingBeing ja kahta LivingBeing: n alaluokkaa nimeltä Human ja Animal .

luo nyt vakiojoukko nimeltä livingBeingArray, jossa on yksi Animal luokan objekti ja yksi human luokan objekti. Mitä luulet tämän array luotu tyyppi päättely? Se on tyypiltään .

Swiftin tyypin Tarkistaja pystyy päättelemään, että Human: llä ja Animal: llä on yhteinen superluokka LivingBeing, joten se päättelee : n tyypin livingBeingArray joukolle.

livingBeingArray tallennetut esineet ovat edelleen Human ja Animal esiintymiä kulissien takana. Jos kuitenkin toistat tämän taulukon sisällön, palautettavat kohteet kirjoitetaan muodossa LivingBeing eikä muodossa Human tai Animal. Jotta voisit työskennellä heidän kanssaan heidän alkuperäisenä tyyppinään, sinun on tarkistettava heidän tyyppinsä tai laskettava heidät toiseen tyyppiin.

käytä tyyppitarkastusoperaattoria (is) tarkastaaksesi, onko jokin instanssi tietynlaista alaluokkaa. Tyyppitarkastuksen operaattori palauttaa true, jos esiintymä on kyseistä alaluokkaa, ja false, jos se ei ole.

harkitse seuraavaa koodia:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

iteroidaan array-objektit for – silmukan päälle.

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 sanoo: tietyn luokan vakio tai muuttuja voi itse asiassa viitata alaluokan esiintymään kulissien takana. Jos uskot, että näin on, voit yrittää laskea alaluokan tyyppiin tyypin cast-operaattorilla (as? tai as!).

yksinkertaistetaan tätä. Tarkastellaan joukkoa livingBeingArray . Tiedämme, että ensimmäinen erä on tyyppiä Animal . Koska array sisältää yhden Animal objektin ja yhden Human objektin, tyyppi päättelee array tyypin LivingBeing. Jos yritämme saada mitään sisältöä tästä array, se palauttaa objektin tyyppi LivingBeing.siinä tapauksessa voimme yrittää downcast se noudettuaan sen muodostavat array.

ero AS: n välillä? ja as!

Downcasting voidaan tehdä kahdella tavalla:

  • ehdollinen downcasting (as?).
  • pakkolasku (as!).

konditionaalinen muoto, as?, palauttaa valinnaisen arvon, jota yrität alentaa. Pakotettu muoto, as!, yrittää alaskirjausta ja pakottaa – purkaa tuloksen yhtenä yhdistelmätoimintona.

käytä tyypinvalajan ehdollista muotoa (as?), kun et ole varma, onnistuuko downcast. Tässä muodossa operaattori palauttaa aina valinnaisen arvon, ja arvo on nil, jos alasajo ei ollut mahdollista. Näin voit tarkistaa onnistuneen downcast.

käytä konetyypin heittäjän pakotettua muotoa (as!) vain silloin, kun olet varma, että downcast onnistuu aina. Tämä operaattorin muoto laukaisee suoritusaikavirheen, jos yrität alaskirjata virheelliseen luokkatyyppiin.

tässä edellä mainitussa skenaariossa, koska tiedämme, että ensimmäinen kohde array on tyyppiä eläin, voimme käyttää pakotettua downcasting.

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

mutta pakotettu alaskirjaus voi epäonnistua, jos yritämme alaskirjata ensimmäisen kohteen Human ja toisen kohteen Animal. Tällöin tuloksena on nil, jota normaali tyyppi ei pysty käsittelemään ja ohjelma kaatuu.

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

tässä skenaariossa, jossa emme ole varmoja, onnistuuko valu, on käytettävä ehdollista alaskirjausta 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)

mutta oikeantyyppinen ehdollinen downcasting onnistuu ja palauttaa oikean valinnaisen tyypin, johon yritämme downcastata.

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

Upcasting

upcasting perusluokan kohteesta sen superluokkaan on myös mahdollista. Käännetäänpä pakotetulla alaskirjauksella luotu animalObject takaisin LivingBeing – luokkaan.

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

animalObjectAsLivingBeingObj on tyyppiä LivingBeing .

Type Casting for Any and AnyObject

Swift tarjoaa kaksi erikoistyyppiä työskentelyyn epäspesifisten tyyppien kanssa:

  • Any voi edustaa minkä tahansa tyyppistä esiintymää, mukaan lukien funktiotyypit.
  • AnyObject voi edustaa minkä tahansa luokan instanssia.

lähde: Internet

hakusanalla ”mikä tahansa” tarkoitetaan ilmentymää, joka kuuluu mihin tahansa tyyppiin, mukaan lukien funktiotyypit. Tarkastellaan joukkoa tyyppiä Any, joka voi hyväksyä erityyppisiä arvoja. Voimme käyttää kytkin tiliote tarkistaa tyypin ja tehdä 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
*/

pakko-ja ehdollinen alasajo ei toimi switch-case

Vastaa

Sähköpostiosoitettasi ei julkaista.