az Apple doc azt mondja: a Type casting egy módja annak, hogy ellenőrizze a példány típusát, vagy kezelje azt egy másik szuperosztályként vagy alosztályként a saját osztályhierarchiájában.

típusú öntés a Swift-ben a is és as operátorokkal valósul meg. Az is egy érték típusának ellenőrzésére szolgál, míg a as egy másik típusú érték leadására szolgál.

Tekintsük a következő osztályokat LivingBeing és a LivingBeing két alosztályát Human és Animal néven .

most hozzon létre egy livingBeingArray nevű állandó tömböt egy Animal osztályobjektummal és egy human osztályobjektummal. Mit gondolsz, milyen típusú ez a tömb, amelyet a type következtetéssel hoztak létre? típusú lesz .

a Swift típusellenőrzője képes arra következtetni, hogy a Human és Animal közös szuperosztálya LivingBeing, ezért a típusra következtet a livingBeingArray tömbre.

a livingBeingArray – ban tárolt elemek még mindig Human és Animal példányok a színfalak mögött. Ha azonban a tömb tartalmát iterálja, a kapott elemek LivingBeing – ként kerülnek beírásra, nem pedig Human vagy Animal – ként. Annak érdekében, hogy natív típusként dolgozhasson velük, ellenőriznie kell a típusukat, vagy le kell állítania őket egy másik típusra.

használja a típusellenőrző operátort (is) annak ellenőrzésére, hogy egy példány egy bizonyos alosztálytípusba tartozik-e. A type check operátor true értéket ad vissza, ha a példány az adott alosztálytípusba tartozik, és false értéket, ha nem.

vegye figyelembe a következő kódot:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

ismételjük meg a tömb objektumokat egy for hurok felett.

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

az Apple doc azt mondja: egy bizonyos osztálytípus állandó vagy változó valójában egy alosztály példányára utalhat a színfalak mögött. Ahol úgy gondolja, hogy ez a helyzet, megpróbálhat az alosztály típusára lecsökkenteni egy type cast operátorral (as? vagy as!).

egyszerűsítsük ezt. Tekintsük a livingBeingArray tömböt . Tudjuk, hogy az első elem Animal típusú . Mivel a tömb egy Animal objektumot és egy Human objektumot tartalmaz, a type következtetés a tömb típusát LivingBeing – ként határozza meg. Ha megpróbálunk bármilyen tartalmat szerezni ebből a tömbből, akkor visszaad egy LivingBeing.típusú objektumot, ebben az esetben megpróbálhatjuk lebecsülni, miután letöltöttük a tömbből.

különbség az as között? és mint!

a Downcasting kétféle módon történhet:

  • feltételes downcasting (mint?).
  • kényszerített downcasting (mint!).

a feltételes forma, as?, egy opcionális értéket ad vissza annak a típusnak, amelyre le szeretné állítani. A kényszerített forma, as!, megkísérli a lesütöttet, és erő-kibontja az eredményt egyetlen összetett műveletként.

használja a type cast operátor feltételes formáját (as?), ha nem biztos abban, hogy a downcast sikeres lesz-e. Az operátor ezen formája mindig egy opcionális értéket ad vissza, és az érték nil lesz, ha a downcast nem volt lehetséges. Ez lehetővé teszi, hogy ellenőrizze a sikeres lesújtott.

csak akkor használja a cast operátor (as!) kényszerített formáját, ha biztos benne, hogy a downcast mindig sikeres lesz. Az operátor ezen formája futásidejű hibát vált ki, ha helytelen osztálytípusra próbál lemorzsolódni.

itt a fenti forgatókönyvben, mivel tudjuk, hogy a tömb első objektuma Animal típusú, kényszerített downcastingot használhatunk.

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

de a kényszerített leszállítás sikertelen lehet, ha megpróbáljuk leszorítani az első objektumot Human – ra, a második objektumot pedig Animal – re. Ebben az esetben az eredmény nil lesz, amelyet egy normál típus nem tud kezelni, és a program összeomlik.

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

ebben a forgatókönyvben, ahol nem vagyunk biztosak abban, hogy az öntés sikeres-e, a feltételes downcastingot kell használnunk 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)

de a helyes típusú feltételes downcasting sikeres lesz, és a megfelelő opcionális típust adja vissza, amelyre megpróbáljuk leszorítani.

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

Upcasting

Upcasting az alap osztály objektum a szuperosztály is lehetséges. Konvertáljuk vissza a kényszerített downcasting által létrehozott animalObject osztályt LivingBeing osztályba.

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

animalObjectAsLivingBeingObj LivingBeing típusú .

Típus Casting bármely és AnyObject

Swift biztosít két speciális típusú dolgozó nem specifikus típusok:

  • Any bármilyen típusú példányt képviselhet, beleértve a függvénytípusokat is.
  • AnyObject bármely osztálytípus példánya lehet.

forrás: Internet

az ‘Any’ kulcsszó bármely típushoz tartozó példány képviseletére szolgál, beleértve a függvénytípusokat is. Vegyünk egy Any típusú tömböt, amely különböző típusú értékeket fogadhat el. Használhatunk egy switch utasítást a típus ellenőrzéséhez és a downcastinghoz.

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

kényszerített és feltételes downcasting nem fog működni a switch-case

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.