Supongamos que tiene una clase y una subclase:
clase A {
valor var1 = 1
}
clase B: A {
valor var2 = 2
}
- ¿Qué harías si pudieras hacer absolutamente cualquier cosa (sin leyes, sin reglas, sin límites, incluso las leyes de la física)?
- ¿Por qué seguimos el flujo convencional de una corriente eléctrica?
- ¿Por qué el sonido de un globo explotando me hace saltar?
- Un globo se mueve hacia arriba con una velocidad de 10 m / s. Libera una piedra que cae al suelo en 11s. ¿La altura del globo en el momento en que se dejó caer la piedra es?
- ¿Cómo incendiarías una casa con una cerilla?
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.