¿Qué es un rechazo forzado?

Supongamos que tiene una clase y una subclase:

clase A {
valor var1 = 1
}

clase B: A {
valor var2 = 2
}

Ahora podemos crear una instancia para cada clase:

dejar a: A = A ()

dejar b: A = B ()

Observe que b es del tipo A, aunque el valor es en realidad una instancia de B. Eso es posible porque B es una subclase de A.

Si desea acceder al valor2 de b, eso no es posible porque b es de tipo A. Para acceder al valor2 primero tenemos que bajar b a la subclase B.

Ahora tenemos dos posibles operadores abatidos:

  • como ?, el operador abatido condicional
  • como !, el operador abatido de fuerza

Primero, echemos un vistazo a como:

let conditionalDowncastA: B? = a como? si
let conditionalDowncastB: B? = b como? si

Tenga en cuenta que el tipo es B? y no B.

Si ejecuta este código, no obtendrá un error, aunque a no es una instancia de la clase B. Esto se debe a que utilizamos el operador opcional downcast. Eso significa que el valor de retorno no es del tipo B sino de B ?.

Después de ejecutar este código, conditionalDowncastA será nulo y conditionalDowncastB será nuestra instancia de B.

Para acceder a value2 podemos usar el encadenamiento opcional:

conditionalDowncastB.?value2

Pero a veces no nos importa el caso de que el downcast pueda fallar. Tal vez ya sabemos que b es una instancia de B. Entonces no lo haremos un valor opcional. Ahí es cuando podemos usar el downcast forzado:

let forceDowncastB: B = b como! si

Observe que ahora tenemos una constante de tipo B y no B ?.

Ahora podemos acceder a value2 más fácilmente:

forceDowncastB.value2

La desventaja de una bajada de fuerza es que debes asegurarte de que la bajada funcionará. Considera lo siguiente:

let forceDowncastA: B = a as! si

Si ejecuta este código, obtendrá un error de tiempo de ejecución porque a no es una instancia de clase B.

More Interesting

¿Existen las sirenas?

¿Se puede modificar la tecnología que hace que los LED produzcan luz visible para producir ondas infrarrojas o de radio?

¿Cómo arden las llamas hacia arriba mientras la gravedad las empuja hacia abajo?

¿Cómo podemos percibir objetos 3D con visión 2D e imaginarlos con visualización 2D? ¿Tenemos otro sentido?

¿Qué es más eficiente energéticamente: 2 ruedas o 4 ruedas?

¿Qué es más peligroso: alimentación de CA o CC?

¿Cuál debería ser la posición relativa del centro de gravedad y el centro de flotabilidad para el equilibrio de un cuerpo que flota sobre el agua?

¿Cómo sabemos que los átomos / partículas subatómicas existen realmente?

Cómo calcular la cantidad de energía perdida en un automóvil de juguete

¿Por qué la mayoría de las cosas se oscurecen después de mojarse?

¿Cuál es su opinión sobre el viaje en el tiempo?

¿Por qué no fluye corriente eléctrica entre los electrodos cuando ningún cable los conecta?

Los fotones tienen masa y se ralentizan en medios más densos. ¿Permite que se usen láseres para asentar y perfeccionar una gota de agua en una esfera en órbita, para que esta esfera perfecta pueda detectar ondas de gravedad mediante el uso de interferometría láser?

¿Por qué la gravedad hace que las cosas caigan a la misma velocidad independientemente de su peso?

¿Por qué es que de noche, cuando apagamos la luz, la habitación se sumerge en la oscuridad pero un poco más tarde podemos tener una visión algo mejor?