2016-01-19 34 views
6

Ich erhalte ein JSON und ich möchte es analysieren, um einen Wert zu erhalten. Ich mache dasInt64 funktioniert nicht, während Int funktioniert

let ddd = oneJson["restaurantId"] as! Int 
print("ddd = \(ddd)") 
let restaurantId = oneJson["restaurantId"] as! Int64 

wie Sie sehen, ich Parsing das gleiche Feld. Hier ist meine JSON

"location":"location here location","restaurantId":0 

Die print-Anweisung funktioniert gut, aber ich erhalte eine Ausnahme auf oneJson["restaurantId"] as! Int64

enter image description here

+0

Ich weiß nicht, was dieses Problem verursacht (daher die Kommentar), aber versuchen Sie es mit '(oneJson [" restaurantId "] als! NSString) .longLongValue', was einen Wert mit dem Typ' Int64' ergibt – Jojodmo

Antwort

0

ich empfehlen würde, nicht Int64 (oder Int32) zu verwenden. Int wird in den meisten Fällen funktionieren.

Sehen Sie diesen Beitrag über die verschiedenen ganzen Zahlen in Swift: https://stackoverflow.com/a/27440158/4687348

+0

Entschuldigung, aber dies ist keine Antwort, ich frage nach Int64, und Ich weiß, warum ich Int64 nicht nur Int brauche. – sarah

+0

Das mag ein guter Rat sein, aber es löst nicht wirklich das Problem, den Wert in ein Int64 zu verwandeln. – Jojodmo

+0

Ich denke, es wäre besser, 'String' anstelle von' Int' oder 'Int64' zu verwenden, nur weil Javascript ist nicht freundlich mit Int64, was in 'js' abgeschnitten wird. –

7

ich diese Marotte in swift Liebe (NOT).

Es ist eine der am wenigsten intuitiven Fehler der Sprache, die ich kenne. Es stellt sich also heraus, dass, wenn Sie ein Dictionary vom Typ AnyObject erhalten, Ints, Doubles, Floats, NICHT als Swift-Typen gespeichert werden. Sie sind gespeichert als ... Überraschung! NSNummer.

Das führt zu einer ganzen Reihe von nicht intuitiven Verhalten, zum Beispiel Typprüfung AnyObjects, um zu sehen, ob Sie ein Double oder Int haben (es kann nicht getan werden).

Aus dem gleichen Grund schlägt Ihr Code fehl. Ändern Sie ihn auf:

let ddd = oneJson["restaurantId"] as! Int 
print("ddd = \(ddd)") 
let restaurantId = (oneJson["restaurantId"] as? NSNumber)?.longLongValue 

Und erinnern Sie sich immer wieder, dass, wenn es ein ANYOBJECT Sie Gießen von Swift versteckt von Ihnen die Tatsache, dass es eine Besetzung von NSNumber tut Swift Basistypen, und dass in Wahrheit, sie sind immer noch nur NSNumbers.

+0

Als Nebenbemerkung müssen Sie Ihrer JSON-Bibliothek vertrauen, um zu wissen, dass sie ihre Eingabe richtig als int 64 liest, sonst verlieren Sie möglicherweise die Präzision. Ich habe dies nie getestet und habe Ihre Implementierungsdetails noch nicht gesehen, aber es lohnt sich, es zu testen. – tbondwilkinson

0

Ja, es ist ein bekannter Fehler in Swift 3, die 4.
Jetzt in Swift gelöst wurde, einfach so schreiben,

let n = NSNumber.init(value: 9223372036854775807) // 2^63 - 1 
print(n, n as! Int64) // will print the right answer. 
Verwandte Themen