Swift otorga una alta prima a la seguridad tipo. Todo el lenguaje Swift fue diseñado teniendo en cuenta la seguridad. Es uno de los sellos distintivos de Swift y uno que debes recibir con los brazos abiertos. Ayudará en el desarrollo de un código limpio y legible y ayudará a evitar que su aplicación se bloquee.
Todos los opcionales en Swift están demarcados con el ?
símbolo. Al establecer ?
después del nombre del tipo en el que está declarando como opcional, esencialmente está convirtiendo esto no como el tipo que está antes del ?
, sino como el tipo opcional .
Nota: Una variable o tipo noInt
es lo mismo que Int?
. Son dos tipos diferentes que no pueden operarse entre sí.
Usando opcional
var myString: String?
myString = "foobar"
Esto no significa que esté trabajando con un tipo de String
. Esto significa que está trabajando con un tipo de String?
(Cadena opcional o Cadena opcional). De hecho, cada vez que intentas
print(myString)
en tiempo de ejecución, se imprimirá la consola de depuración Optional("foobar")
. La parte " Optional()
" indica que esta variable puede o no tener un valor en tiempo de ejecución, pero resulta que actualmente contiene la cadena "foobar". Esta " Optional()
" indicación permanecerá a menos que haga lo que se llama "desenvolver" el valor opcional.
Desenvolver un opcional significa que ahora está convirtiendo ese tipo como no opcional. Esto generará un nuevo tipo y asignará el valor que residía dentro de ese opcional al nuevo tipo no opcional. De esta manera, puede realizar operaciones en esa variable, ya que el compilador garantiza que tiene un valor sólido.
Desenvolver condicionalmente verificará si el valor en el opcional es nil
o no. Si no es así nil
, habrá una variable constante recién creada a la que se le asignará el valor y se desenvolverá en la constante no opcional. Y a partir de ahí, puede usar de forma segura lo no opcional en el if
bloque.
Nota: Puede darle a su constante sin envoltura condicional el mismo nombre que la variable opcional que está desenvolviendo.
if let myString = myString {
print(myString)
// will print "foobar"
}
La opción de desempaquetado condicional es la forma más limpia de acceder al valor de un opcional porque si contiene un valor nulo, todo lo que se encuentre dentro del bloque if let no se ejecutará. Por supuesto, como cualquier instrucción if, puede incluir un bloque else
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
El desenvolvimiento forzado se realiza empleando lo que se conoce como el !
operador ("explosión"). Esto es menos seguro pero aún permite que su código se compile. Sin embargo, cada vez que use el operador de explosión, debe estar 1000% seguro de que su variable contiene un valor sólido antes de desenvolverse por la fuerza.
var myString: String?
myString = "foobar"
print(myString!)
Lo anterior es un código Swift completamente válido. Imprime el valor myString
que se estableció como "foobar". El usuario lo vería foobar
impreso en la consola y eso es todo. Pero supongamos que el valor nunca se estableció:
var myString: String?
print(myString!)
Ahora tenemos una situación diferente en nuestras manos. A diferencia de Objective-C, cada vez que se intenta desenvolver por la fuerza un opcional, y el opcional no se ha configurado nil
, es decir , cuando intenta desenvolver el opcional para ver qué hay dentro de su aplicación se bloqueará.
Desenvoltura con fundición tipo . Como dijimos anteriormente, si bien usted es unwrapping
el opcional, en realidad está convirtiendo a un tipo no opcional, también puede convertir el no opcional a un tipo diferente. Por ejemplo:
var something: Any?
En algún lugar de nuestro código, la variable something
se establecerá con algún valor. Tal vez estamos usando genéricos o tal vez hay otra lógica que está causando que esto cambie. Entonces, más adelante en nuestro código, queremos usar, something
pero aún así podemos tratarlo de manera diferente si es un tipo diferente. En este caso, querrá usar la as
palabra clave para determinar esto:
Nota: El as
operador es cómo escribe cast en Swift.
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
Observe la diferencia entre las dos as
palabras clave. Como antes, cuando desenvolvimos a la fuerza un opcional, utilizamos el !
operador de explosión para hacerlo. Aquí harás lo mismo, pero en lugar de lanzarlo como no opcional, también lo lanzarás como Int
. Y debe poder ser abatido ya que Int
, de lo contrario, es como usar el operador de explosión cuando el valor es que nil
su aplicación fallará.
Y para utilizar estas variables en algún tipo de operación matemática, deben desenvolverse para hacerlo.
Por ejemplo, en Swift solo se pueden operar entre sí tipos de datos de números válidos del mismo tipo. Cuando emite un tipo con el as!
, está forzando el rechazo de esa variable como si estuviera seguro de que es de ese tipo, por lo tanto, es seguro operar y no bloquear su aplicación. Esto está bien siempre y cuando la variable sea del tipo al que la estás enviando, de lo contrario tendrás un desastre en tus manos.
Sin embargo, la transmisión con as!
permitirá que su código se compile. Al lanzar con un as?
es una historia diferente. De hecho, as?
declara su Int
como un tipo de datos completamente diferente todos juntos.
Ahora es Optional(0)
Y si alguna vez trataste de hacer tu tarea escribiendo algo como
1 + Optional(1) = 2
Es probable que tu profesor de matemáticas te haya dado una "F". Lo mismo con Swift. Excepto que Swift preferiría no compilar en absoluto en lugar de darle una calificación. Porque al final del día, lo opcional puede ser nulo .
Safety First Kids.