as
utilizado para upcasting y tipo casting a tipo puente
as?
utilizado para fundición segura, devuelve cero si falla
as!
utilizado para forzar el lanzamiento, se bloquea si falla
Nota:
as!
no se puede convertir el tipo sin formato a opcional
Ejemplos:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
Ejemplo
var age: Int? = nil
var height: Int? = 180
Añadiendo un ?inmediatamente después del tipo de datos, le dice al compilador que la variable puede contener un número o no. ¡Ordenado! Tenga en cuenta que realmente no tiene sentido definir las constantes opcionales: puede establecer su valor solo una vez y, por lo tanto, podría decir si su valor será nulo o no.
¿Cuándo deberíamos usar "?" y cuando "!"
digamos que tenemos una aplicación simple basada en UIKit. tenemos algo de código en nuestro controlador de vista y queremos presentar un nuevo controlador de vista encima. y debemos decidir insertar la nueva vista en la pantalla usando el controlador de navegación.
Como sabemos, cada instancia de ViewController tiene un controlador de navegación de propiedad. Si está creando una aplicación basada en un controlador de navegación, esta propiedad del controlador de vista principal de su aplicación se configura automáticamente y puede usarla para empujar o abrir controladores de vista. Si usa una sola plantilla de proyecto de aplicación, no habrá un controlador de navegación creado automáticamente para usted, por lo que el controlador de vista predeterminado de su aplicación no tendrá nada almacenado en la propiedad navigationController.
Estoy seguro de que ya adivinó que este es exactamente un caso para un tipo de datos opcional. Si marca UIViewController, verá que la propiedad se define como:
var navigationController: UINavigationController? { get }
Así que volvamos a nuestro caso de uso. Si sabe con certeza que su controlador de vista siempre tendrá un controlador de navegación, puede continuar y forzar su desenvuelto:
controller.navigationController!.pushViewController(myViewController, animated: true)
Cuando pones un! detrás del nombre de la propiedad le dices al compilador que no me importa que esta propiedad sea opcional, sé que cuando este código se ejecuta siempre habrá un almacén de valor, así que trata este Opcional como un tipo de datos normal. Bueno, ¿no es agradable? Sin embargo, ¿qué pasaría si no hay un controlador de navegación en su controlador de vista? Si sugieres que siempre habrá un valor almacenado en navigationController, ¿estaba mal? Tu aplicación fallará. Tan simple y feo como eso.
¡Así que usa! solo si está 101% seguro de que es seguro.
¿Qué tal si no está seguro de que siempre habrá un controlador de navegación? ¿Entonces puedes usar? en vez de una !:
controller.navigationController?.pushViewController(myViewController, animated: true)
Que ? detrás del nombre de la propiedad le dice al compilador que no sé si esta propiedad contiene nil o un valor, así que: si tiene valor, úselo y, de lo contrario, solo considere la expresión completa nil.¿Efectivamente el? le permite usar esa propiedad solo en el caso de que haya un controlador de navegación. No si cheques de cualquier tipo o fundiciones de cualquier tipo. Esta sintaxis es perfecta cuando no le importa si tiene un controlador de navegación o no, y quiere hacer algo solo si lo hay.
Muchísimas gracias a Fantageek