Apple doc mówi: typowanie jest sposobem sprawdzania typu wystąpienia lub traktowania go jako innej klasy nadrzędnej lub podklasy z innego miejsca w hierarchii klas.

Typ odlewania w języku Swift jest zaimplementowany z operatorami is i as. is służy do sprawdzania typu wartości, podczas gdy as służy do rzucania wartości na inny typ.

rozważ następujące klasy LivingBeing i dwie podklasy LivingBeing nazwane Human i Animal .

teraz Utwórz stałą tablicę o nazwie livingBeingArray z jednym obiektem klasy Animal i jednym obiektem klasy human. Jak myślisz, jaki jest typ tej tablicy utworzony za pomocą wnioskowania typów? Będzie to typ .

sprawdzanie typu Swifta jest w stanie wydedukować, że Human i Animal mają wspólną superklasę LivingBeing, a więc wnioskuje Typ dla tablicy livingBeingArray.

elementy przechowywane w livingBeingArray są nadal Human i Animal instancjami za kulisami. Jeśli jednak iterujesz zawartość tej tablicy, elementy, które otrzymujesz, są wpisywane jako LivingBeing, a nie jako Humanlub Animal. Aby pracować z nimi jako ich natywnym typem, musisz sprawdzić ich typ lub obniżyć je do innego typu.

użyj operatora sprawdzania typu (is), aby sprawdzić, czy instancja jest określonego typu podklasy. Operator type check zwraca true, jeśli instancja jest typu podklasy, a false, jeśli nie.

rozważ następujący kod:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

iteratuj obiekty tablicy w pętli 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 mówi: stała lub zmienna określonego typu klasy może faktycznie odnosić się do wystąpienia podklasy za kulisami. Jeśli uważasz, że tak jest, Możesz spróbować obniżyć do typu podklasy za pomocą operatora type cast (as? lub as!).

uprośćmy to. Rozważmy tablicę livingBeingArray . Wiemy, że pierwszy element jest typu Animal. Ponieważ tablica zawiera jeden obiekt Animal i jeden obiekt Human, wnioskowanie typów zadecyduje o typie tablicy jako LivingBeing. Jeśli spróbujemy pobrać jakąkolwiek zawartość z tej tablicy, zwróci ona ci obiekt typu LivingBeing.w takim przypadku możemy spróbować go obniżyć po pobraniu z tablicy.

różnica między as? i as!

Downcasting można zrobić na dwa sposoby:

  • warunkowe downcasting (jak?).
  • Wymuszony downcasting (jako!).

formularz warunkowy, as?, zwraca opcjonalną wartość typu, do którego próbujesz przejść. Forced form, as!, próbuje downcast i siłą-rozpakowuje wynik jako pojedyncze działanie złożone.

użyj formy warunkowej operatora type cast (as?), gdy nie masz pewności, czy downcast się powiedzie. Ta forma operatora zawsze zwróci wartość opcjonalną, a wartość będzie wynosić nil, jeśli downcast nie był możliwy. Pozwala to sprawdzić, czy udany downcast.

użyj wymuszonej formy operatora typu cast (as!) tylko wtedy, gdy masz pewność, że downcast zawsze się powiedzie. Ta forma operatora spowoduje błąd uruchomieniowy, jeśli spróbujesz obniżyć do nieprawidłowego typu klasy.

tutaj w powyższym scenariuszu, ponieważ wiemy, że pierwszy obiekt w tablicy jest typu Animal, możemy użyć Forced downcasting.

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

ale wymuszone downcastowanie może się nie udać, jeśli spróbujemy obniżyć pierwszy obiekt do Human, a drugi obiekt do Animal. W tym przypadku wynikiem będzie nil , którego normalny typ nie może obsłużyć, a program ulegnie awarii.

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

w tym scenariuszu, gdzie nie jesteśmy pewni, czy casting się powiedzie, powinniśmy użyć warunkowego downcastingu 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 warunkowe zmniejszanie poprawnego typu powiedzie się i zwróci poprawny opcjonalny typ, do którego próbujemy zmniejszyć.

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

Upcasting

Upcasting z obiektu klasy podstawowej do klasy nadrzędnej jest również możliwy. Przekonwertujmy animalObject utworzony przez wymuszone downcasting z powrotem do klasy LivingBeing.

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

animalObjectAsLivingBeingObj jest typu LivingBeing .

Typ odlewania dla dowolnego I Dowolnegoobject

Swift zapewnia dwa specjalne typy do pracy z niespecyficznymi typami:

  • Any może reprezentować instancję dowolnego typu, w tym typów funkcji.
  • AnyObject może reprezentować instancję dowolnego typu klasy.

źródło: Internet

słowo kluczowe 'Any’ jest używane do reprezentowania instancji, która należy do dowolnego typu, w tym do typów funkcji. Rozważ tablicę typu Any, która może przyjmować różne typy wartości. Możemy użyć instrukcji switch, aby sprawdzić typ i zrobić 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
*/

wymuszony i warunkowy downcasting nie zadziała w switch-case

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.