o Apple doc diz: a transmissão de tipos é uma maneira de verificar o tipo de uma instância ou tratar essa instância como uma superclasse ou subclasse diferente de outro lugar em sua própria hierarquia de classes.

o tipo de fundição no Swift é implementado com os operadores is e as. is é usado para verificar o tipo de um valor, enquanto as é usado para converter um valor em um tipo diferente.

considere as seguintes classes LivingBeing e duas subclasses de LivingBeing nomeadas Human e Animal .

agora crie uma matriz constante chamada livingBeingArray com um objeto de classe Animal e um objeto de classe human. O que você acha que o tipo desta matriz criado via inferência de tipo? Será do tipo .

o verificador de tipo do Swift é capaz de de deduzir que Human e Animal têm uma superclasse comum de LivingBeing e, portanto, infere um tipo de para a matriz livingBeingArray.

os itens armazenados em livingBeingArray ainda são Human e Animal instâncias nos bastidores. No entanto, se você iterar sobre o conteúdo desta matriz, os itens que você recebe de volta serão digitados como LivingBeing, e não como Human ou Animal. Para trabalhar com eles como seu tipo nativo, você precisa verificar seu tipo ou retirá-los para um tipo diferente.

Use o operador de verificação de tipo (is) para verificar se uma instância é de um determinado tipo de subclasse. O operador de verificação de tipo retorna true se a instância for desse tipo de subclasse e false se não for.

considere o seguinte código:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

vamos iterar os objetos da matriz em um loop 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 diz: uma constante ou variável de um determinado tipo de classe pode realmente se referir a uma instância de uma subclasse nos bastidores. Onde você acredita que este é o caso, você pode tentar downcast ao tipo da subclasse com um operador do molde do tipo (as? ou as!).

vamos simplificar isso. Considere a matriz livingBeingArray . Sabemos que o primeiro item é do tipo Animal. Como a matriz contém um objeto Animal e um objeto Human, a inferência de tipo decidirá o tipo de matriz como LivingBeing. Se tentarmos obter qualquer conteúdo desta matriz, ele retornará um objeto do tipo LivingBeing.nesse caso, podemos tentar retirá-lo depois de buscá-lo na matriz.

diferença entre as? e como!

Downcasting pode ser feito de duas maneiras:

  • downcasting condicional (como?).
  • downcasting forçado (como!).

a forma condicional, as?, retorna um valor opcional do tipo ao qual você está tentando fazer downcast. A forma forçada, as!, tenta o downcast e força-desembrulha o resultado como uma única ação composta.

Use a forma condicional do operador type cast (as?) quando não tiver certeza se o downcast será bem-sucedido. Esta forma do operador sempre retornará um valor opcional, e o valor será nil se o downcast não for possível. Isso permite que você verifique se há um downcast bem-sucedido.

Use a forma forçada do operador type cast (as!) somente quando tiver certeza de que o downcast sempre terá sucesso. Esta forma do operador acionará um erro de tempo de execução se você tentar fazer downcast para um tipo de classe incorreto.

aqui no cenário acima, já que sabemos que o primeiro objeto na matriz é do tipo Animal, podemos usar downcasting forçado.

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

mas downcasting forçado pode falhar se tentarmos downcast o primeiro objeto para um Human e segundo objeto para um Animal. Nesse caso, o resultado será nil que um tipo normal não pode manipular e o programa travará.

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

neste cenário, onde não temos certeza se o casting é bem-sucedido, devemos usar o downcasting condicional 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)

mas o downcasting condicional do tipo correto é bem-sucedido e retorna o tipo opcional correto ao qual estamos tentando fazer downcast.

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

Upcasting

Upcasting do objeto de classe base para sua superclasse também é possível. Vamos converter o animalObject criado por downcasting forçado de volta para a classe LivingBeing.

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

animalObjectAsLivingBeingObj é do tipo LivingBeing .

tipo de fundição para qualquer e AnyObject

Swift fornece dois tipos especiais para trabalhar com tipos inespecíficos:

  • Any pode representar uma instância de qualquer tipo, incluindo tipos de função.
  • AnyObject pode representar uma instância de qualquer tipo de classe.

Fonte: Internet

A palavra-chave ‘Qualquer’ é usado para representar uma instância que pertence a nenhum tipo, incluindo a função de tipos. Considere uma matriz do tipo Any que pode aceitar diferentes tipos de valores. Podemos usar uma instrução switch para verificar o tipo e fazer 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
*/

o downcasting forçado e condicional não funcionará em um switch-case

Deixe uma resposta

O seu endereço de email não será publicado.