2014-12-03 11 views
18

Mam ten kod w Swift i działa, ale myślę, że jest lepszy sposób, aby mój obiekt z NSNumber i przekonwertować go do podwójnego:Swift obiekt convert to NSNumber Double

var rating: NSNumber 
var ratingDouble: Double 

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

ratingDouble = Double(rating.doubleValue) 
+0

Does ratingDouble = ocena nie działa? Swift powinien wspierać łączenie tych dwóch elementów. –

+0

Jeśli to zrobię: błąd: "NSNumber" nie można zmienić na "Double". Ale mogę to zrobić: ratingDouble = rating.doubleValue –

Odpowiedz

48

Istnieje kilka rzeczy, które możesz zrobić:

var rating: NSNumber 
var ratingDouble: Double 

ratingDouble = rating as Double // 1 
ratingDouble = Double(rating)  // 2 
ratingDouble = rating.doubleValue // 3 
  1. pierwszy element wykorzystuje Objective-C mostków co pozwala AnyObject i NSNumber być oddane jako Double|Float|Int|UInt|Bool .
  2. Drugi element prawdopodobnie przechodzi przez konstruktora z podpisem init(_ number: NSNumber). Nie mogłem go znaleźć w module lub dokumentach, ale przekazanie AnyObject wygenerowało błąd, który nie może być niejawnie spuszczony na NSNumber, więc musi tam być, a nie tylko mostkować.
  3. Trzeci element nie wykorzystuje funkcji językowych w ten sam sposób. Po prostu korzysta z tego, że doubleValue zwraca Double.

Jedną z zalet 1 jest to, że działa również na AnyObject więc kod może być:

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

Zauważ, że usunąłem ? ze swojej funkcji i przeniósł ! w każdym połączeniu.! unikasz bezpieczeństwa ?, więc nie ma powodu, by robić to wspólnie.

+0

Pierwsza część działa, ale kod: niech ratingDouble = self.prodResult! .prodsInfo.prodList [indexPath.row] .avgRating! jak Double nie, Xcode nie mówi mi dokładnego błędu, to po prostu zawiesza się, jakieś pomysły na temat dlaczego? –

+0

Twoja aplikacja się zawiesza lub program Xcode się zawiesza? Jaki jest typ 'self.prodResult! .prodsInfo.prodList [indexPath.row] .avgRating' –

+0

Aplikacja ulega awarii. Typ to NSNumber. Zatrzymuje się za pomocą EXC_BAD_ACCESS, ale tuż przed tym: _dynamicCastUnknownClass (swift :: OpaqueValue *, void *, swift :: Metadata const *, swift :: DynamicCastFlags). –

0

ze składnią guard let, tutaj jest jak zamienić AnyObject Do Double

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