the - swift(lenguaje de programación)
¿Qué significa un signo de exclamación en una propiedad en Swift? (1)
Esta pregunta ya tiene una respuesta aquí:
Hay tres formas de declarar una propiedad en Swift:
var optStr: String?
var normStr: String = "normStr"
var exactStr: String!
El primero es propiedad con un tipo optional
, un tipo que puede contener nil o la Cadena en nuestro caso. El segundo es una propiedad que siempre contiene el String. Debe inicializarse en init o en la declaración.
Pero, ¿qué hay de la tercera manera?
var exactStr: String!
Hice algunos experimentos en el patio de recreo, y resultó que una función que toma type?
puede tomar tanto type
, type?
y type!
variables como argumento:
var optStr: String?
var normStr: String
var forcedStr: String!
func printStr(str: String?) {
println("str: /(str)")
}
printStr(optStr) //prints: "str: nil"
//printStr(normStr) //doesn''t compile as not initialized
printStr(forcedStr) //prints: "str: nil"
optStr = "optStr"; normStr = "normStr"; forcedStr = "forcedStr"
printStr(optStr) //prints "str: optStr"
printStr(normStr) //prints "str: normStr"
printStr(forcedStr) //prints "str: forcedStr"
Entonces, ¿por qué y cuándo debería usar el type!
?
Actualización: esto no es un duplicado de ¿Qué significa un signo de exclamación en el lenguaje Swift? . No estoy preguntando sobre desenvolver una variable : estoy preguntando sobre la declaring
una propiedad con un signo de exclamación ( Type!
).
Es una variable de tipo "Cadena opcional implícitamente desenvuelta". Esencialmente, cada acceso de implicitStr
se trata como si estuviera escrito implicitStr!
(desenvolver así el valor).
Esto, por supuesto, causará un bloqueo si el valor es nulo. Todavía puede probar la vía opcional implícita if implicitStr != nil
, o usarla en el encadenamiento opcional como var foo = implicitStr?.uppercaseString
. Por lo tanto, puede usarlo tan seguramente como una opción normal; solo está sesgado hacia el caso donde el valor no es nulo.
Las opciones opcionales sin envoltorio implícito son bastante útiles en los casos en que el valor puede no estar presente en la inicialización, pero se configuran temprano y es poco probable que vuelvan a ser nulas. (Por ejemplo, una variable que establezca en -awakeFromNib podría ser razonablemente una opción opcional sin encriptar implícitamente).
Además, dado que los métodos de Objective-C pueden devolver tanto el tipo nil como el tipo de objeto, sus valores de retorno no se pueden modelar como no opcionales. Sin embargo, para evitar el uso liberal del desenvolvimiento forzado siempre que se trate con API Cocoa, los parámetros y tipos de retorno de las API Cocoa generalmente se representan como opciones opcionales sin envoltorio implícito.