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._forceBridgeFromObjectiveCque llama aDouble(exactly:)conDouble,Int64oUInt64según el tipo almacenado en larating. Fallará y colapsará la aplicación si el número no es exactamente representable comoDouble. Por ejemplo,UInt64.maxtiene 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
NaNya que esa revisión no está incluida.Esta función siempre devuelve un
Doublepero perderá precisión en los casos en que 1 y 2 se bloquearían. Esto literalmente solo llama adoubleValuecuando 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-Cque permite queAnyObjectyNSNumberenDouble|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 pasarAnyObjectgeneró un error que no se puedeNSNumberforma implícita aNSNumberpor 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
doubleValuedevuelve 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.