Apple doc říká: Type casting je způsob, jak zkontrolovat typ instance nebo zacházet s touto instancí jako s jinou supertřídou nebo podtřídou odněkud jinde ve své vlastní hierarchii tříd.

Typ lití v Swift je implementován s operátory is a as. is se používá ke kontrole typu hodnoty, zatímco as se používá k obsazení hodnoty na jiný typ.

zvažte následující třídy LivingBeing a dvě podtřídy LivingBeing pojmenované Human a Animal .

nyní vytvořte konstantní pole s názvem livingBeingArray s jedním objektem třídy Animal a jedním objektem třídy human. Co si myslíte, že typ tohoto pole vytvořeného pomocí inference typu? Bude typu .

Kontrola typu Swiftu je schopna odvodit, že Human a Animal mají společnou supertřídu LivingBeing, a proto odvozuje Typ pro pole livingBeingArray.

položky uložené v livingBeingArray jsou stále Human a Animal instance v zákulisí. Pokud však iterujete obsah tohoto pole, položky, které obdržíte zpět, jsou zadány jako LivingBeing a ne jako Human nebo Animal. Chcete-li s nimi pracovat jako s jejich rodným typem, musíte zkontrolovat jejich typ nebo je snížit na jiný typ.

pomocí operátoru kontroly typu (is) zkontrolujte, zda je instance určitého typu podtřídy. Operátor kontroly typu vrací true , pokud je instance tohoto typu podtřídy a false, pokud není.

zvažte následující kód:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

iterujme objekty pole přes smyčku for.

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 říká: konstanta nebo proměnná určitého typu třídy může ve skutečnosti odkazovat na instanci podtřídy v zákulisí. Pokud se domníváte, že tomu tak je, můžete zkusit snížit Typ podtřídy pomocí operátoru typu cast (as? nebo as!).

zjednodušme si to. Zvažte pole livingBeingArray . Víme, že první položka je typu Animal . Protože pole obsahuje jeden objekt Animal a jeden objekt Human, odvození typu rozhodne o typu pole jako LivingBeing. Pokud se pokusíme získat jakýkoli obsah z tohoto pole, vrátí vám objekt typu LivingBeing.v takovém případě se můžeme pokusit jej po načtení z pole stáhnout.

rozdíl mezi as? a jako!

Downcasting lze provést dvěma způsoby:

  • podmíněné downcasting (jako?).
  • nucené downcasting (as!).

podmíněný formulář as? vrací volitelnou hodnotu typu, na který se pokoušíte snížit. Nucená forma, as!, se pokouší o snížení a vynutí-rozbalí výsledek jako jednu složenou akci.

použijte podmíněný formulář operátora type cast (as?), pokud si nejste jisti, zda downcast uspěje. Tato forma operátora vždy vrátí volitelnou hodnotu a hodnota bude nil, pokud snížení nebylo možné. To vám umožní zkontrolovat úspěšný pokles.

použijte vynucený formulář operátora type cast (as!) pouze tehdy, pokud jste si jisti, že downcast bude vždy úspěšný. Tato forma operátora spustí chybu runtime, pokud se pokusíte snížit na nesprávný typ třídy.

zde ve výše uvedeném scénáři, protože víme, že první objekt v poli je typu Animal, můžeme použít nucené downcasting.

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

ale nucené downcasting může selhat, pokud se pokusíme snížit první objekt na Human a druhý objekt na Animal. V tomto případě bude výsledek nil, který normální typ nemůže zvládnout a program se zhroutí.

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

v tomto scénáři, kde si nejsme jisti, zda casting uspěje, bychom měli použít podmíněné 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)

ale podmíněné downcasting správného typu uspěje a vrátí správný volitelný typ, na který se snažíme downcastovat.

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

Upcasting

Upcasting z objektu základní třídy do jeho supertřídy je také možné. Převedeme animalObject vytvořené nuceným downcastingem zpět do třídy LivingBeing.

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

animalObjectAsLivingBeingObj je typu LivingBeing .

Typ lití pro jakýkoli a AnyObject

Swift poskytuje dva speciální typy pro práci s nespecifickými typy:

  • Any může představovat instanci jakéhokoli typu, včetně typů funkcí.
  • AnyObject může představovat instanci libovolného typu třídy.

zdroj: Internet

Klíčové slovo „Any“ se používá k reprezentaci instance, která patří k jakémukoli typu včetně typů funkcí. Zvažte pole typu Any, které může přijímat různé typy hodnot. Můžeme použít příkaz switch pro kontrolu typu a 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
*/

nucené a podmíněné downcasting nebude fungovat v switch-case

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.