ios - attributed - Swift: ¿diferencia como String? como? Cadena
attributed string (4)
Esta pregunta ya tiene una respuesta aquí:
- Downcasting en Swift con como y como? 3 respuestas
¿Hay alguna diferencia entre as? String
as? String
vs. as String?
en Swift? Si es así, ¿cuál es la diferencia y cuándo debo usar uno frente a otro?
Del libro The Swift Programming Language
,
-
as
es un operador de conversión de tipo que usamos para bajar a lasubclass
yas?
se utiliza para un formulario opcional, cuando no estamos seguros de si ladowncast
tendrá éxito. Considera el siguiente ejemplofor item in library { if let movie = item as? Movie { println("Movie: ''(movie.name)'', dir. (movie.director)") } else if let song = item as? Song { println("Song: ''(song.name)'', by (song.artist)") } }
El ejemplo comienza intentando downcast
el elemento actual como una Movie
. Debido a que el item
es una instancia de MediaItem
, es posible que sea una Movie
; igualmente, también es posible que sea una Song
, o incluso un MediaItem base.
-
String?
Unoptional value
contiene un valor o contienenil
para indicar que falta el valor.
De esto,
-
as? String
as? String
significa que cuando no sabes lo que estás reduciendo, estás asumiendo que eso es unaString
, pero podría serInteger
oFloat
oArray
oDictionary
-
as String?
significa que es unOptional Value
, puede contener un valor deString
oNil
.
Hay una diferencia sutil pero importante:
variable as? String
variable as? String
: lavariable
puede ser de cualquier tipo, como una matriz, un número entero, etc. Convertir a cadena si es una cadena, establecer anil
contrario.variable as String?
: lavariable
es unaString?
, pero almacenado en un tipo opaco, comoAnyObject?
, o es una cadena no opcional. Si es algo diferente, se genera una excepción de tiempo de ejecución.
Algunos ejemplos:
var x: AnyObject? = "Test"
x as String? // OK, the result is an optional string
x as? String // OK, evaluates to an optional string
"string" as String? // OK, evaluates to optional string
x as? Int // OK, evaluates to nil, it''s not an Int
x as Int? // Runtime exception, it''s not castable to optional Int
Asi que:
-
as? Type
as? Type
significa: convertir a este tipo, si es posible, de lo contrario evaluar anil
-
as Type?
significa: lanzar a unType
opcional, porque sé que es unType
opcional. Entiendo que si no es así, se genera una excepción de tiempo de ejecución
Sin embargo, la diferencia real es entre as?
y as
: el primero es un intento de lanzamiento, el segundo es un lanzamiento forzado, lo que resulta en un error de tiempo de ejecución si no es posible.
Actualización 14 de diciembre de 2015 Desde Swift 1.2 , hay 3 variaciones del operador as
:
-
as?
es un intento de lanzar, evaluando anil
si falla el lanzamiento -
as!
es un lanzamiento forzado, que resulta en una excepción de tiempo de ejecución si el lanzamiento falla (esto es loas
hizo anteriormente) -
as
ahora es un tipo especial de conversión que se usará cuando se emita a tipos equivalentes, generalmente tipos con puentes, comoNSString
''sString
yNSString
.
Sí, hay una diferencia.
En el primer caso, está realizando una conversión opcional al tipo String
. Esto devolverá un valor si el objeto que está intentando convertir es de hecho un String
o nil si no lo es.
En el segundo caso, ¿está haciendo un lanzamiento forzado al tipo String?
. Si el valor que está emitiendo no es una cadena, bloqueará su programa.
SÍ , hay diferencias.
variable as String?
downcast to String opcional. ¿Si la variable
no es String?
causará la excepción de tiempo de ejecución.
mientras variable as? String
variable as? String
devolverá nil
si su variable
no es del tipo String
o devolverá la variable
descendente a la Cadena. Esto es un downcasting condicional , si no está seguro acerca de la conversión, debe usar esto.