attributed ios swift

ios - attributed - Swift: ¿diferencia como String? como? Cadena



attributed string (4)

Esta pregunta ya tiene una respuesta aquí:

¿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 ,

  1. as es un operador de conversión de tipo que usamos para bajar a la subclass y as? se utiliza para un formulario opcional, cuando no estamos seguros de si la downcast tendrá éxito. Considera el siguiente ejemplo

    for 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.

  1. String? Un optional value contiene un valor o contiene nil para indicar que falta el valor.

De esto,

  1. as? String as? String significa que cuando no sabes lo que estás reduciendo, estás asumiendo que eso es una String , pero podría ser Integer o Float o Array o Dictionary
  2. as String? significa que es un Optional Value , puede contener un valor de String o Nil .

Hay una diferencia sutil pero importante:

  • variable as? String variable as? String : la variable puede ser de cualquier tipo, como una matriz, un número entero, etc. Convertir a cadena si es una cadena, establecer a nil contrario.

  • variable as String? : la variable es una String? , pero almacenado en un tipo opaco, como AnyObject? , 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 a nil
  • as Type? significa: lanzar a un Type opcional, porque sé que es un Type 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 a nil 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 lo as hizo anteriormente)
  • as ahora es un tipo especial de conversión que se usará cuando se emita a tipos equivalentes, generalmente tipos con puentes, como NSString ''s String y NSString .

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.


, 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.