簡體   English   中英

Int工作時Int64不起作用

[英]Int64 does't work while Int works

我收到一個JSON,我想解析它以獲得一個值。 我這樣做

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

如你所見,我正在解析相同的字段。 這是我的JSON

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

print語句工作正常,但我在oneJson["restaurantId"] as! Int64上得到一個例外oneJson["restaurantId"] as! Int64 oneJson["restaurantId"] as! Int64

在此輸入圖像描述

我很喜歡這個怪癖(不是)。

這是我所知道的語言中最不直觀的問題之一。 所以事實證明,當你得到一個AnyObject類型的字典時,Ints,Doubles,Floats,不會存儲為Swift本機類型。 他們被存儲為......驚喜! 的NSNumber。

這會導致一系列不直觀的行為,例如類型檢查AnyObjects以查看您是否有Double或Int(無法完成)。

出於同樣的原因,您的代碼失敗了。 將其更改為:

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

並且一次又一次地提醒自己,當它是你正在投射的AnyObject時,Swift正在向你隱瞞它從NSNumber轉換為Swift基類型的事實,事實上,它們仍然只是NSNumbers。

我建議,不要使用Int64 (或Int32 )。 Int將在大多數情況下工作。

查看有關Swift中不同整數的這篇文章: https//stackoverflow.com/a/27440158/4687348

是的,它是Swift 3中的已知錯誤,已在Swift 4中解決。
現在,你就是這樣寫的,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM