2014-12-03 14 views
18

Ich habe diesen Code in Swift und es funktioniert, aber ich würde denken, gibt es einen besseren Weg, um mein Objekt von NSNumber zu erhalten und wandelt es in ein Double:Swift convert-Objekt, das NSNumber ist zu Double

var rating: NSNumber 
var ratingDouble: Double 

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

ratingDouble = Double(rating.doubleValue) 
+0

funktioniert ratingDouble = Bewertung nicht konvertieren? Swift sollte die Überbrückung der beiden unterstützen. –

+0

Wenn ich das tue: Fehler: "NSNumber" ist nicht in "Double" umwandelbar. Aber ich kann dies tun: ratingDouble = rating.doubleValue –

Antwort

48

Es gibt mehrere Dinge, die Sie tun können:

var rating: NSNumber 
var ratingDouble: Double 

ratingDouble = rating as Double // 1 
ratingDouble = Double(rating)  // 2 
ratingDouble = rating.doubleValue // 3 
  1. Das erste Element nutzt Objective-C Brücken die AnyObject und NSNumber erlaubt zu gieße als Double|Float|Int|UInt|Bool . Das zweite Element durchläuft vermutlich einen Konstruktor mit der Signatur init(_ number: NSNumber). Ich konnte es nicht in dem Modul oder in den Dokumenten finden, aber die Übergabe AnyObject in erzeugte einen Fehler, dass es nicht implizit zu NSNumber niedergeschlagen werden kann, also muss es dort sein und nicht gerade überbrücken.
  2. Das dritte Element verwendet Sprachfeatures nicht auf die gleiche Weise. Es nutzt nur die Tatsache aus, dass doubleValue eine Double zurückgibt.

Ein Vorteil von 1 ist, dass es funktioniert auch für AnyObject so könnte Ihr Code sein:

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

Bitte beachte, dass ich die ? aus Ihrer Funktion entfernt und bewegt die ! in Jedes Mal, wenn Sie verwenden.! Sie vermeiden die Sicherheit von ?, also gibt es keinen Grund, beides zusammen zu tun.

+0

Der erste Teil funktioniert, aber der Code: lassen ratingDouble = self.prodResult .prodsInfo.prodList [indexPath.row] .avgRating! als Double nicht, Xcode sagt mir nicht den genauen Fehler, es stürzt nur dort, irgendwelche Ideen über warum? –

+0

Ihre App stürzt ab oder Xcode stürzt ab? Was ist der Typ von 'self.prodResult! .prodsInfo.prodList [indexPath.row] .avgRating' –

+0

Die App stürzt ab. Der Typ ist NSNummer. Es endet mit EXC_BAD_ACCESS, aber direkt davor: _dynamicCastUnknownClass (swift :: OpaqueValue *, void *, swift :: Metadaten const *, swift :: DynamicCastFlags). –

0

Mit der guard let Syntax, hier ist, wie ein AnyObject auf eine Double

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