2017-10-11 2 views
1

J'essaie d'obtenir un enregistrement de MongoDB qui a une propriété DateTime. Cette propriété est ISODate mais est reçue en tant que type de données long (millisecondes depuis 1970) via l'API Perfect-MongoDB.Déballage de type de données long dans Swift Linux

Le code ressemble à ceci:

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

Ce code fonctionne très bien sous Mac OSX. Cependant, sous Linux, created["$date"] as? Int64 est toujours nil.

J'ai essayé un certain nombre de choses, y compris en utilisant Double et NSNumber au lieu de Int64 mais il est toujours nil.

Des idées pour accéder à ce numéro? J'ai besoin de le convertir en une date lisible, et la façon dont je le fais est à travers TimeInterval() qui a besoin d'une valeur Double pour les secondes après 1970, donc il doit être divisible par 1000 et convertible en Double pendant cette étape.

Éditer: Ceci est le code NSNumber où intDate est toujours nil et ne tombe donc pas par la ligne let date. something est non nul

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)) 
} 

Edit 2: Exemple Dictionnaire pour ce cas:

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

Pouvez-vous montrer ce que vous avez essayé avec NSNumber? Cela devrait fonctionner. –

+0

@MartinR a ajouté mon code pour celui-ci dans mon édition – Tyress

+0

Essayez 'comme? Int' ... –

Répondre

1

Apparemment, il n'y a qu'une conversion limitée entre les types entiers et NSNumber à Swift sur Linux, vous devez jeter à la type exact, qui est Int dans ce cas:

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

Est-ce que 'Int' n'est pas juste un typealias pour' Int64' sur les plates-formes 64 bits (ce qui est majoritaire maintenant, je suppose)? – user28434

+0

@ user28434: 'Int' a la même taille que Int64 (ou Int32 sur une plate-forme 32 bits). Mais est un type différent. Vous pouvez vérifier que 'let y: Int64 = Int (123)' ne compile pas. –

+0

Ok, j'ai compris. Je pensais que le code en réponse est presque le même qu'en question. – user28434