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
}
Esto llama a
Double._forceBridgeFromObjectiveC
que llama aDouble(exactly:)
conDouble
,Int64
oUInt64
según el tipo almacenado en larating
. Fallará y colapsará la aplicación si el número no es exactamente representable comoDouble
. Por ejemplo,UInt64.max
tiene más dígitos de los que puede almacenarDouble
, por lo que se bloqueará.Esto es exactamente igual a 1, excepto que también puede fallar en
NaN
ya que esa revisión no está incluida.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 adoubleValue
cuando se pasa unNSNumber
.Igual que 3.
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.
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
- El primer elemento aprovecha el puente de
Objective-C
que permite queAnyObject
yNSNumber
enDouble|Float|Int|UInt|Bool
. - 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 pasarAnyObject
generó un error que no se puedeNSNumber
forma implícita aNSNumber
por lo que debe estar allí y no solo enlazar. - El tercer elemento no emplea características de lenguaje de la misma manera. Simplemente aprovecha el hecho de que
doubleValue
devuelve unDouble
.
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.