una reconocerlos reconocer predicado para oracion objeto niƱos indirecto ejercicios ejemplos directo diferenciar complemento como circunstancial ios swift

ios - reconocerlos - objeto directo ejemplos



Swift convierte el objeto que es NSNumber a Double (1)

Tengo este código en Swift y funciona, pero creo que hay una mejor manera de obtener mi objeto de NSNumber y convertirlo en un Double:

var rating: NSNumber var ratingDouble: Double rating = self.prodResult?.prodsInfo.prodList[indexPath.row].avgRating as NSNumber!! ratingDouble = Double(rating.doubleValue)


Actualizar

El comportamiento de Swift aquí ha cambiado bastante desde 1.0. No es que antes fuera tan fácil, pero Swift ha hecho más difícil la conversión entre tipos de números porque quiere que usted sea explícito sobre qué hacer con la pérdida de precisión. Sus nuevas opciones ahora se ven así:

var rating: NSNumber var ratingDouble: Double ratingDouble = rating as! Double // 1 ratingDouble = Double(exactly: rating)! // 2 ratingDouble = Double(truncating: rating) // 3 ratingDouble = rating.doubleValue // 4 if let x = rating as? Double { // 5 ratingDouble = x } if let x = Double(exactly: rating) { // 6 ratingDouble = x }

  1. Esto llama a Double._forceBridgeFromObjectiveC que llama a Double(exactly:) con Double , Int64 o UInt64 según el tipo almacenado en la rating . Fallará y colapsará la aplicación si el número no es exactamente representable como Double . Por ejemplo, UInt64.max tiene más dígitos de los que puede almacenar Double , por lo que se bloqueará.

  2. Esto es exactamente igual a 1, excepto que también puede fallar en NaN ya que esa revisión no está incluida.

  3. Esta función siempre devuelve un Double pero perderá precisión en los casos en que 1 y 2 se bloquearían. Esto literalmente solo llama a doubleValue cuando se pasa un NSNumber .

  4. Igual que 3.

  5. Esto es como 1, excepto que en lugar de bloquear la aplicación, devolverá cero y no se evaluará el interior de la declaración.

  6. Igual que 5, pero como 2 devolverá nulo si el valor es NaN .

Si sabe que su fuente de datos se está duplicando, es probable que 1-4 le sirva de la misma manera. Sin embargo, 3 y 4 serían mis primeras elecciones.

Vieja respuesta para Swift 1 y 2

Hay varias cosas que puedes hacer:

var rating: NSNumber var ratingDouble: Double ratingDouble = rating as Double // 1 ratingDouble = Double(rating) // 2 ratingDouble = rating.doubleValue // 3

  1. El primer elemento aprovecha el puente de Objective-C que permite que AnyObject y NSNumber en Double|Float|Int|UInt|Bool .
  2. El segundo elemento presumiblemente pasa por un constructor con la firma init(_ number: NSNumber) . No pude encontrarlo en el módulo ni en los documentos, pero al pasar AnyObject generó un error que no se puede NSNumber forma implícita a NSNumber por lo que debe estar allí y no solo enlazar.
  3. El tercer elemento no emplea características de lenguaje de la misma manera. Simplemente aprovecha el hecho de que doubleValue devuelve un Double .

Uno de los beneficios de 1 es que también funciona para AnyObject por lo que su código podría ser:

let ratingDouble = self.prodResult!.prodsInfo.prodList[indexPath.row].avgRating! as Double

Tenga en cuenta que he eliminado el ? De su función y movió el ! en. Siempre que uses! ¿Estás evitando la seguridad de ? así que no hay razón para hacer las dos cosas juntos.