English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este artículo, aprenderás sobre las opciones, sus casos de uso y la gestión de opciones en Swift.
En el artículo anterior, conocimos los diferentes tipos de datos disponibles en Swift, y también notamos que las variables o constantes declaradas con estos tipos contienen valores por defecto.
Ejemplo:}
let someValue = Int() print(someValue)
Al ejecutar el programa, la salida es:
0
Pero, en Swift, también hay otro tipo de datos llamado Optional, que tiene un valor predeterminado de nil. Si desea que una variable o constante no contenga ningún valor, puede usar Optional. El tipo opcional puede contener un valor o no contener un valor (nil).
Técnicamente, puede considerar que es una caja de zapatos opcional. La caja de zapatos puede contener zapatos o no. Por lo tanto, al quitar los zapatos de la caja, debe saberlo de antemano.
Puede representar simplemente los datos tipo como Optional. El método es agregar ! o ? al tipo. Si el valor opcional contiene un valor, se devuelve su valor como Optional <Value>, de lo contrario se devuelve nil.
var someValue: Int? var someAnotherValue: Int! = print(someValue) print(someAnotherValue)
Al ejecutar el programa, la salida es:
nil nil
En el programa anterior, utilizamos ? y ! para inicializar un tipo opcional. Ambos métodos pueden crear métodos opcionales, pero hay una diferencia principal, que se discutirá a continuación.
Declarar un Int opcional significa que la variable tendrá un valor entero o no tendrá valor. Debido a que no se asigna ningún valor a la variable, por lo que puede ver dos impresiones de nil en la pantalla.
let someValue: Int? = 5 print(someValue) print(someValue!)
Al ejecutar el programa, la salida es:
Optional(5) 5
En el programa anterior, declaramos un tipo opcional Int y le asignamos un valor5.
Imprimir Optional(someValue) no le devolverá5, en lugar de Optional(5) tiene la forma como se mencionó anteriormente: Optional <Value>. Para acceder a <Value>, necesitamos un mecanismo llamado desempaquetado (desempaquetado) mediante el mecanismo.
Puede desempaquetar un valor a través de la variable/Añadir el carácter ! al final de una constante para expandir el contenido opcional, como en la siguiente línea: print(someValue!). print(someValue!) desempaqueta el contenido opcional y lo muestra en la pantalla 5.
Pero, recuerde que solo debe usar este mecanismo de desempaquetado cuando esté seguro de que el valor opcional tiene un valor cuando se accede a él.
También puede crear contenido opcional desempaquetado de la siguiente manera:
let someValue: Int! = 5 print(someValue)
Al ejecutar el programa, la salida es:
5
En el programa anterior, Int! crea un contenido opcional sin envoltorio, que se desempaqueta automáticamente cuando se accede a él, por lo que no es necesario usar el carácter ! cada vez.
Asegúrate de que las variables tengan un valor siempre que se acceda a ellas al usar estas opciones. De lo contrario, se producirá un colapso fatal.
var someValue: Int! var unwrappedValue:Int = someValue //colapsa debido a esta línea
Cuando ejecutes este programa, obtendrás un colapso fatal: se descubrió un nil inesperado al desempaquetar el valor opcional, porque el código unwrappedValue:Int = someValue intenta asignar el valor de la opción someValue a la variable unwrappedValue.
Pero, somevalue es un tipo opcional que contiene un valor nil. Intentar asignar un valor nil a la variable unwrappedValue (que no es un Optional) causará un colapso.
A continuación, se explicarán diferentes métodos para manejar este caso.
Para usar un valor opcional, es necesario desempaquetarlo. Una mejor manera de usar un valor opcional es desempaquetarlo condicionalmente, en lugar de usar el operador ! para desempaquetar forzadamente.
Esto se debe a que la descomposición condicional pregunta¿Te preguntas si este variable tiene un valor?。Si es así, proporciona ese valor, de lo contrario maneja el caso nil.
Por el contrario, la descomposición forzada indica que la variable realmente tiene un valor cuando se utiliza. Por lo tanto, cuando intentas desempaquetar una variable nil, tu programa lanzará una excepción de desempaquetado opcional y se producirá una excepción inesperada de nil. A continuación, se describen algunas técnicas útiles para la descomposición condicional:
Puedes usar una declaración if para comparar el parámetro opcional con nil para encontrar si el parámetro opcional contiene un valor. Puedes usar el operador de comparación "igual a" (==) o el operador de comparación "diferente de" (!=) en la declaración if.
var someValue: Int? var someAnotherValue: Int! = 0 if someValue != nil { print("Contiene valor \(someValue!)") } else { print("No contiene valor") } if someAnotherValue != nil { print("Contiene valor \(someAnotherValue!)") } else { print("No contiene valor") }
Al ejecutar el programa, la salida es:
No contiene valor Contiene el valor 0
En el programa anterior, si la declaración opcional contiene un valor, se ejecuta el código dentro de la declaración if, de lo contrario, se ejecuta el bloque else. Una de las principales desventajas de este método para manejar opciones es que aún necesitas usar el operador ! para desempaquetar el valor desde la opción.
El enlace opcional puede ayudarte a encontrar si el valor opcional contiene un valor. Si el valor opcional contiene un valor, ese valor puede usarse como una constante o variable temporal. Por lo tanto, puedes usar el enlace opcional junto con una declaración if para verificar el valor dentro del enlace opcional y extraerlo como una constante o variable en una sola operación.
var someValue: Int? var someAnotherValue: Int! = 0 if let temp = someValue { print("Contiene valor (temp)") } else { print("No contiene valor") } if let temp = someAnotherValue { print("Contiene valor (temp)") } else { print("No contiene valor") }
Al ejecutar el programa, la salida es:
No contiene valor Contiene el valor 0
En el programa anterior, si la declaración opcional contiene un valor, se ejecuta el código dentro de la declaración if. De lo contrario, se ejecuta el bloque else. if-La declaración let también desempaqueta automáticamente el valor y almacena el valor desempaquetado en la constante temp. La principal ventaja de este método es que, aunque puedes determinar que un contenido opcional contiene un valor, no necesitas desempaquetar forzadamente el valor.
También puedes usar la declaración guard en Swift para manejar contenido opcional. Si no sabes qué es guard, no te preocupes. Ahora, considera a guard como if-No hay condición de prohibición else sin if. Si la condición falla, se ejecuta la declaración else. De lo contrario, se ejecuta la siguiente declaración. Para más detalles, consultaSwift Guard.
func testFunction() { let someValue: Int? = 5 guard let temp = someValue else { return } print("Tiene algún valor (temp)") } testFunction()
Al ejecutar el programa, la salida es:
Tiene algún valor 5
En el programa anterior, guard contiene una condición, es decir, si la opción someValue contiene un valor. Si contiene un valor, entonces guard-La declaración let desempaqueta automáticamente el valor y coloca el valor desempaquetado en la constante temp. De lo contrario, se ejecutará el bloque else y regresará a la función de llamada. Porque la opción contiene un valor, se llama a la función print. Para más detalles, consulta Swift guard.
En Swift, también puedes usar el operador de coalescencia para verificar si una opción contiene un valor. Se define como (a??b). Expandir una opción a, si contiene un valor, devuelve ese valor, o si a está vacío, devuelve el valor predeterminado b.
var someValue: Int! let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
Al ejecutar el programa, la salida es:
5
En el programa anterior, la variable someValue se define como opcional y contiene el valor nil. El operador de combinación vacía no puede desempaquetar el valor opcional, por lo que devuelve defaultValue. Por lo tanto, la instrucción print(unwrappedValue) muestra5.
var someValue: Int? = 10 let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
Al ejecutar el programa, la salida es:
10
Pero, en el programa anterior, la variable opcional someValue se inicializa con el valor10. Por lo tanto, el operador de combinación vacía con éxito desempaqueta el valor someValue. Por lo tanto, la instrucción someValue ?? defaultValue en la consola devuelve10La instrucción print(unwrappedValue) muestra10.