2016-01-19 28 views
6

Otrzymuję JSON i chcę przeanalizować go, aby uzyskać wartość. Robię to, ponieważ widzę, że parsuję to samo pole. Oto mój JSONInt64 nie działa podczas Int działa

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

Instrukcja print działa dobrze, ale pojawia się wyjątek na oneJson["restaurantId"] as! Int64

enter image description here

+0

Nie wiem, co jest przyczyną tego problemu (stąd komentarz), ale spróbuj użyć '(oneJson [" restaurantId "] jako! NSString) .longLongValue', co da wartość z typem' Int64' – Jojodmo

Odpowiedz

0

Polecam, aby nie używać Int64 (lub Int32). Int będzie działać w większości przypadków.

Zobacz ten post na temat różnych liczb całkowitych Swift: https://stackoverflow.com/a/27440158/4687348

+0

przepraszam, ale to nie jest odpowiedź, pytam o Int64, i Wiem, dlaczego potrzebuję Int64, nie tylko Int. – sarah

+0

To może być dobra rada, ale tak naprawdę nie rozwiązuje problemu zamiany wartości na 'Int64' – Jojodmo

+0

Myślę, że lepiej byłoby użyć' String' zamiast 'Int' lub' Int64', tylko dlatego, że javascript nie jest przyjazny dla Int64, który zostanie obcięty w 'js'. –

7

Kocham to dziwactwo w Swift (NOT).

To jedna z najmniej intuicyjnych gier języka, który znam. Tak więc okazuje się, że gdy otrzymasz słownik z typem AnyObject, Ints, Doubles, Floats, NIE są przechowywane jako rodzime typy Swift. Są przechowywane jako ... niespodzianka! NSNumber.

Co prowadzi do wielu niezrozumiałych zachowań, na przykład sprawdzanie typu AnyObjects, aby sprawdzić, czy masz podwójne lub int (nie można tego zrobić).

Z tego samego powodu Twój kod nie działa. Zmień go na adres:

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

I przypomnieć sobie jeszcze raz i jeszcze raz, że gdy jest to AnyObject jesteś odlewania z Swift ukrywa od ciebie fakt, że robi odlew z NSNumber Swift typów bazowych, i że w prawda, wciąż są po prostu NSNumbers.

+0

Na marginesie, będziesz musiał zaufać swojej bibliotece JSON, aby wiedzieć, aby odczytać jej dane wejściowe poprawnie jako int 64, lub możesz tracić precyzję. Nigdy tego nie testowałem i nie widziałem szczegółów implementacji, ale na pewno warto to przetestować. – tbondwilkinson

0

Tak, jest to znany błąd w Swift 3, który został rozwiązany w Swift 4.
Teraz wystarczy napisać tak,

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