Opcionales Swift: cómo usarlos (con ejemplos)

En este artículo, aprenderá sobre opcional, sus casos de uso y manejo opcional en Swift.

En el artículo anterior, aprendimos sobre los diferentes tipos de datos disponibles en Swift y también notamos que la variable o constante declarada de esos tipos contiene un valor predeterminado.

Ejemplo:

 dejar someValue = Int () imprimir (someValue) 

Cuando ejecute el programa, la salida será:

 0

Sin embargo, existe otro tipo de datos en Swift llamado Opcional, cuyo valor predeterminado es un valor nulo ( nil). Puede usar opcional cuando desee que una variable o constante no contenga ningún valor. Un tipo opcional puede contener un valor o no tener un valor (un valor nulo).

No técnicamente, puedes pensar en opcional como una caja de zapatos. La caja de zapatos puede contener o no un zapato. Por lo tanto, debe saberlo de antemano al acceder al zapato desde la caja.

¿Cómo declarar un Opcional?

Simplemente puede representar un tipo de datos como opcional agregando !o ?al Type. Si un opcional contiene un valor, devuelve un valor como Optional, si no, devuelve nil.

Ejemplo 1: ¿Cómo declarar un opcional en Swift?

 var someValue:Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue) 

Cuando ejecute el programa, la salida será:

 nada nada

En el programa anterior, hemos inicializado un tipo opcional usando ?y !. Ambas formas son válidas para crear un opcional, pero hay una diferencia importante que exploraremos a continuación.

Declarar un Int opcional significa que la variable tendrá un valor entero o no tendrá ningún valor. Dado que no se asigna ningún valor a la variable, puede ver ambas printsalidas de declaración nilen la pantalla.

Ejemplo 2: Asignar y acceder a un valor de un opcional

 let someValue:Int? = 5 print(someValue) print(someValue!) 

Cuando ejecute el programa, la salida será:

 Opcional (5) 5 

En el programa anterior, hemos declarado un Inttipo opcional y le hemos asignado el valor 5.

Como puede ver, imprimir el opcional como print(someValue)no le da 5pero Optional(5). Es de la forma como se describió anteriormente: Optional. Para acceder desde él, necesitamos un mecanismo llamado desenvolver .

Puede desenvolver un opcional agregando un !carácter al final de la variable / constante como en la siguiente línea print(someValue!). print(someValue!)desenvuelve el opcional y las salidas 5en la pantalla.

Sin embargo, recuerde, este tipo de mecanismo de desenvolvimiento solo debe usarse cuando esté seguro de que el opcional seguramente tendrá un valor cuando acceda a él.

Ejemplo 3: declarar explícitamente un opcional desenvuelto

También puede crear un opcional sin empaquetar como:

 let someValue:Int! = 5 print(someValue) 

Cuando ejecute el programa, la salida será:

 5

En el programa anterior, Int!crea un opcional desenvuelto, que desenvuelve automáticamente el valor mientras accede a él para que no necesite agregar el !carácter cada vez .

Asegúrese de que mientras utiliza este tipo de opciones, la variable siempre deberá tener un valor cuando acceda a ella. Si no lo hace, obtendrá un error fatal.

Ejemplo 4: error fatal al acceder a un nulo sin empaquetar opcional

 var someValue:Int! var unwrappedValue:Int = someValue //crashes due to this line 

Cuando ejecute el programa, obtendrá un bloqueo como error fatal: inesperadamente encontrado nil al desenvolver un valor Opcional porque el código unwrappedValue:Int = someValueintenta asignar un valor de Opcional someValue a la variable UnrappedValue.

Sin embargo, somevalue es un Optionaltipo que contiene nilvalor. Intentar asignar un valor nulo a la variable unsrappedValue que no es opcional provocará un bloqueo.

Existen diferentes técnicas para manejar este caso que se explican a continuación.

Manipulación opcional

Para utilizar el valor de un opcional, es necesario desenvolverlo. Una mejor forma de utilizar el valor opcional es desenvolver condicionalmente en lugar de forzar el desenvolvimiento mediante el !operador.

Esto se debe a que el desenvolver condicionalmente pregunta ¿ Comprobar si esta variable tiene un valor? . Si es así, dé el valor, de lo contrario manejará el caso nulo.

Por el contrario, el desenvolvimiento forzado dice que esta variable tiene un valor mientras la usa . Por lo tanto, cuando fuerce el desencadenamiento de una variable que es nil, su programa arrojará un nil encontrado inesperadamente mientras desenvuelve una excepción opcional y se bloqueará . Algunas de las técnicas para desenvolver condicionalmente se explican a continuación:

1. Declaración if

You can use if statement and compare optional with nil to find out whether a optional contains a value or not. You can use the comparison operator "equal to" operator (==) or the "not equal to" operator (!=) in the if statement.

Example 5: Optional handling with if else statement

 var someValue:Int? var someAnotherValue:Int! = 0 if someValue != nil ( print("It has some value (someValue!)") ) else ( print("doesn't contain value") ) if someAnotherValue != nil ( print("It has some value (someAnotherValue!)") ) else ( print("doesn't contain value") ) 

When you run the program, the output will be:

 doesn't contain value It has some value 0 

In the above program, the code inside if statement executes if an optional contain a value, otherwise the statement inside the else block executes. The major drawback of optional handling using this technique is, you still need to unwrap the value from optional using ! operator.

2. Optional Binding (if-let)

Optional binding helps you to find out whether an optional contains a value or not. If an optional contains a value, that value is available as a temporary constant or variable. Therefore, optional binding can be used with if statement to check for a value inside an optional, and to extract that value into a constant or variable in a single action.

Example 5: Optional handling using if let statement

 var someValue:Int? var someAnotherValue:Int! = 0 if let temp = someValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) if let temp = someAnotherValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) 

When you run the program, the output will be:

 doesn't contain value It has some value 0 

In the above program, the code inside if statement executes if the optional contains a value. Otherwise the else block gets executed. The if-let statement also automatically unwraps the value and places the unwrapped value in temp constant. This technique has major advantage because you don't need to forcely unwrap the value although being certain an optional contains a value.

3. Guard statement

You can use guard to handle optionals in Swift. Don't worry if you don't know what guard is. For now, just think of guard as an if-else condition with no if block. If the condition fails, else statement is executed. If not, next statement is executed. See Swift guard for more details.

Example 6: Optional handling using guard-let

 func testFunction() ( let someValue:Int? = 5 guard let temp = someValue else ( return ) print("It has some value (temp)") ) testFunction() 

When you run the program, the output will be:

 It has some value 5

In the above program, the guard contains a condition whether an optional someValue contains a value or not. If it contains a value then guard-let statement automatically unwraps the value and places the unwrapped value in temp constant. Otherwise, else block gets executed and and it would return to the calling function. Since, the optional contains a value, print function is called.

4. Nil-coalescing operator

In Swift, you can also use nil-coalescing operator to check whether a optional contains a value or not. It is defined as (a ?? b). It unwraps an optional a and returns it if it contains a value, or returns a default value b if a is nil.

Example 7: Optional handling using nil-coalescing operator

 var someValue:Int! let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

When you run the program, the output will be:

 5

En el programa anterior, la variable someValue se define como opcional y contiene un valor nulo. El operador coalescente nulo no puede desenvolver el opcional, por lo que devuelve defaultValue. Por lo tanto, la declaración print(unwrappedValue)genera 5 en la consola.

 var someValue:Int? = 10 let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

Cuando ejecute el programa, la salida será:

 10

Sin embargo, en el programa anterior, la variable opcional someValue se inicializa con el valor 10. Entonces, el operador de fusión nil desenvuelve con éxito el valor de someValue. Por lo tanto, la declaración someValue ?? defaultValuedevuelve 10 y la declaración print(unwrappedValue)genera 10 en la consola.

Articulos interesantes...