2014-12-03 14 views
18

Ho questo codice Swift e funziona, ma vorrei che ci sia un modo migliore per ottenere il mio oggetto dalla NSNumber e convertirlo in un doppio:oggetto convertito Swift che è NSNumber al Doppia

var rating: NSNumber 
var ratingDouble: Double 

rating = self.prodResult?.prodsInfo.prodList[indexPath.row].avgRating as NSNumber!! 

ratingDouble = Double(rating.doubleValue) 
+0

fa ratingDouble = voto non funziona? Swift dovrebbe supportare il collegamento tra i due. –

+0

In tal caso: errore: "NSNumber" non è convertibile in "Double". Ma posso farlo: ratingDouble = rating.doubleValue –

risposta

48

ci sono diverse cose che puoi fare:

var rating: NSNumber 
var ratingDouble: Double 

ratingDouble = rating as Double // 1 
ratingDouble = Double(rating)  // 2 
ratingDouble = rating.doubleValue // 3 
  1. Il primo elemento sfrutta Objective-C ponte che permette AnyObject e NSNumber ad essere lanciato come Double|Float|Int|UInt|Bool .
  2. Il secondo elemento attraversa presumibilmente un costruttore con la firma init(_ number: NSNumber). Non sono riuscito a trovarlo nel modulo o nei documenti ma passando il AnyObject nel generato un errore che non può essere implicitamente downcast a NSNumber quindi deve essere lì e non solo il bridging.
  3. Il terzo elemento non utilizza le funzionalità del linguaggio nello stesso modo. Si avvantaggia solo del fatto che doubleValue restituisce un Double.

Uno dei vantaggi di 1 è che funziona anche per AnyObject modo che il codice potrebbe essere:

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

Si noti che ho rimosso il ? dalla vostra funzione e spostato la ! in Ogni volta che si utilizza.! stai evitando la sicurezza di ? quindi non c'è motivo di fare entrambe le cose insieme.

+0

La prima parte funziona, ma il codice: let ratingDouble = self.prodResult! .prodsInfo.prodList [indexPath.row] .avgRating! come Double no, Xcode non mi sta dicendo l'errore esatto, si blocca semplicemente lì, qualche idea sul perché? –

+0

La tua app si arresta in modo anomalo o Xcode si arresta in modo anomalo? Qual è il tipo di 'self.prodResult! .prodsInfo.prodList [indexPath.row] .avgRating' –

+0

L'app si arresta in modo anomalo. Il tipo è NSNumber. Si arresta con EXC_BAD_ACCESS, ma proprio prima è: _dynamicCastUnknownClass (swift :: OpaqueValue *, void *, swift :: Metadata const *, swift :: DynamicCastFlags). –

0

Con la sintassi guard let, ecco come convertire un AnyObject ad un Double

guard let myVariable:Double = (myAnyObject as! NSNumber) as Double else { 
    return 
} 
Problemi correlati