while optionals language for collection swift optional forced-unwrapping

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ó).