在Swift Linux中展开长数据类型

问题描述:

我试图从具有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' ... –

显然有整数类型和斯威夫特在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