2017-10-11 47 views
1

我試圖從具有DateTime屬性的MongoDB獲取記錄。該屬性是ISODate,但通過Perfect-MongoDB API作爲長數據類型(1970年以來的毫秒)接收。在Swift Linux中展開長數據類型

的代碼看起來是這樣的:

if var something = dictionary["Something"] as? [String:Any], var intDate = something["$date"] as? Int64 
{ 
let date = Date(timeIntervalSince1970: TimeInterval(intDate/1000)) 
} 

此代碼是在Mac OSX上工作的罰款。但是在Linux中,created["$date"] as? Int64總是nil

我試過幾件事,包括使用DoubleNSNumber而不是Int64,但它仍然是nil

有關我如何訪問此號碼的任何想法?我需要將它轉換爲可讀的日期,而我這樣做的方式是通過TimeInterval(),在1970年之後需要秒的Double值,所以它需要被1000整除,並在該步驟中轉換爲Double。

編輯:這是NSNumber代碼,其中intDate仍然是nil,因此不通過let date行。 something不是nil

if var something = dictionary["Something"] as? [String:Any], var intDate = something["$date"] as? NSNumber 
{ 
    let date = Date(timeIntervalSince1970: TimeInterval(NSDecimalNumber(decimal:intDate.decimalValue/1000).doubleValue)) 
} 

編輯2:樣品字典這種情況:

var dictionary : [String:Any] = ["SomethingElse":"SomeOtherData","Something":["$date": 1507710414599]] 
+0

您能不能告訴你試着用的NSNumber?這應該工作。 –

+0

@MartinR在我的編輯中添加了我的代碼 – Tyress

+0

試試'as? Int' ... –

回答

1

顯然有整數類型和斯威夫特在Linux上NSNumber之間只有有限的轉換,所以你要投給確切類型, 這是Int在這種情況下:

let dictionary : [String: Any] = ["SomethingElse":"SomeOtherData","Something":["$date": 1507710414599]] 

if let something = dictionary["Something"] as? [String:Any], 
    let numDate = something["$date"] as? Int { 

    let date = Date(timeIntervalSince1970: Double(numDate)/1000) 
    print("Date:", date) 
} 
+0

對於64位平臺上的Int64,Int'不是'Int'嗎? – user28434

+0

@ user28434:'Int'的大小與Int64(或32位平臺上的Int32)的大小相同。但是是一種不同的類型。你可以驗證'let y:Int64 = Int(123)'不能編譯。 –

+0

好吧,明白了。我認爲答案中的代碼與問題中的代碼幾乎相同。 – user28434