mi a különbség az is, as, as között?, mint! Swiftben? Nos, nézzük meg.
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
ésas
operátorokkal valósul meg. Azis
egy érték típusának ellenőrzésére szolgál, míg aas
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
ésAnimal
közös szuperosztályaLivingBeing
, ezért atí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?
vagyas!
).
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.

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