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 ,
-
ases un operador de conversión de tipo que usamos para bajar a lasubclassyas?se utiliza para un formulario opcional, cuando no estamos seguros de si ladowncasttendrá é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 valuecontiene un valor o contienenilpara indicar que falta el valor.
De esto,
-
as? Stringas? Stringsignifica que cuando no sabes lo que estás reduciendo, estás asumiendo que eso es unaString, pero podría serIntegeroFloatoArrayoDictionary -
as String?significa que es unOptional Value, puede contener un valor deStringoNil.
Hay una diferencia sutil pero importante:
variable as? Stringvariable as? String: lavariablepuede ser de cualquier tipo, como una matriz, un número entero, etc. Convertir a cadena si es una cadena, establecer anilcontrario.variable as String?: lavariablees 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? Typeas? Typesignifica: convertir a este tipo, si es posible, de lo contrario evaluar anil -
as Type?significa: lanzar a unTypeopcional, porque sé que es unTypeopcional. 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 anilsi 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 loashizo anteriormente) -
asahora es un tipo especial de conversión que se usará cuando se emita a tipos equivalentes, generalmente tipos con puentes, comoNSString''sStringyNSString.
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.