optionals - text swift
Diferencia entre los opcionales de desenvolvimiento de fuerza y los opcionales de desenvolvimiento implĂcito (3)
Estaba muy confundido sobre el desenvolvimiento forzado y el desenvolvimiento implícito al principio. Ahora, el siguiente entendimiento viene de mi autoestudio:
No hay ninguna acción disponible para el desenvolvimiento implícito, pero hay algo que se denomina Opcionales sin desenvolver implícitamente. Los opcionales implícitamente sin envolver y los opcionales normales son ambos opcionales, la diferencia es que cuando se accede a un Opcional sin desenvolver implícitamente, usted sabe con seguridad que hay un valor válido bajo el capó y que está listo para su uso. Las opciones normales son necesarias if let
enlace o una acción de desenvolvimiento forzado ( !
) Para acceder a los valores posibles detrás de las variables opcionales.
Resumen :
El desenvolvimiento forzado es una acción que se realiza en los Opcionales normales.
Los opcionales implícitamente desenvueltos son opcionales , que generalmente se usan para la inicialización de clase y pasarán valores sin signo de exclamación cuando se usen.
Pregunta :
Estoy en lo cierto? Si mi comprensión no es precisa, le agradecería que me corrigiera.
Gracias
En primer lugar vamos a definir un opcional
Un valor opcional es un contenedor de algún tipo ( Int
, String
, UIColor
, ...), podría contener el valor ( 1
, "Hello world"
, .greenColor()
, ...) o nil
.
let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil
Cuando en Swift vemos un valor opcional pensamos:
Ok esto podría contener el valor real o
nil
Fuerza de desenvolver
Es la acción de extraer el valor contenido dentro de un Optional
. Esta operación es peligrosa porque le está diciendo al compilador: Estoy seguro de que este valor opcional contiene un valor real, ¡extráigalo!
let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!
Ahora anInt
contiene el valor 1.
Si realizamos un despliegue de fuerza en un valor opcional que no contiene fatalError
, fatalError
un fatalError
, la aplicación falla y no hay forma de recuperarlo.
let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!
fatal error: unexpectedly found nil while unwrapping an Optional value
Opcionales implícitamente sin envolver
Cuando definimos un opcional implícitamente desenvuelto, definimos un contenedor que realizará automáticamente un desenvolvimiento de fuerza cada vez que lo lea.
var text: String! = "Hello"
Si ahora leemos text
let name = text
no obtenemos una String
opcional String
sino una String
simple porque el text
se desenvolvió automáticamente y está contenido.
Sin embargo, el texto sigue siendo opcional, por lo que podemos poner un valor nil
en su interior.
text = nil
Pero tan pronto como lo leemos (y contiene nil
) obtenemos un error fatal porque estamos desenvolviendo un nil
opcional que contiene
let anotherName = text
fatal error: unexpectedly found nil while unwrapping an Optional value
Un opcional implícitamente sin envolver es un opcional normal detrás de escena, pero también puede usarse como un valor no opcional, así que sí, está en lo correcto .
Pero si declara un valor como implícitamente desenvuelto, es equivalente a forzarlo en cada uso.
Para los opcionales implícitamente desenvueltos, hay 4 razones principales para hacerlo.
1: una constante que no se puede definir durante la inicialización
2: interactuar con una API de Objective-C
3: cuando su aplicación no puede recuperarse de una variable que es nil
4: Inicializadores NSObject
Yo diría que no, estás dibujando una falsa distinción:
La primera mitad es correcta; Desempaquetar es ciertamente algo que haces con los Opcionales, y el desenvolvimiento forzado es una forma de hacerlo (una forma insegura).
Pero en cuanto a lo que es un Opcional sin desenvolver implícitamente: es una forma de marcar un tipo Opcional para que se realice el desenvolvimiento forzado (si usa el Opcional en un lugar donde no se puede usar, pero podría usarse si se desenvolvió).