2017-04-22 2 views
2

J'ai un tableau appelé myArray dans lequel les dictionnaires sont ajoutés Je veux que ce dictionnaire soit trié par heure qui est une clé dans le dictionnaire. Et ce temps est en String. Le format de date de l'heure est "aaaa/MM/jj HH: mm: ss"Tri du tableau du dictionnaire avec la date Swift 3

J'ai essayé avec la solution de code ci-dessous mais donne un avertissement de "Cast from 'String?" au type non lié 'Date' échoue toujours ".

let sortedArray = self.myArray.sorted{ ($0["Time"] as? Date)! > ($1["Time"] as? Date)! } 
print(sortedArray) 

Si quelqu'un peut m'aider, merci.

+0

Pouvez-vous vous définir le format de temps? – Rahul

+0

Je l'ai fait en question @Rahul –

+0

Vous pouvez utiliser 'DateFormatter' – Rahul

Répondre

6

Vous n'avez pas besoin de convertir en temps de date pour ce genre. Le format international (aaaa/MM/jj HH: mm: ss) que vous utilisez fournit l'ordre de tri correct sous la forme d'une chaîne.

+0

bonne idée de comparer :) – Vyacheslav

+1

Pour que cela soit clair, votre code devient 'let sortedArray = self.myArray.sorted {($ 0 [" Time "])! > ($ 1 ["Temps"])! } ' – rmaddy

+0

Génial ça marche! –

3

Vous devez convertir chaîne en date en utilisant ce code:

let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" 
    let date = dateFormatter.date(from: "2017/04/22 00:00:00") ?? Date() 

, utilisez ceci:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" 

    let sortedArray = self.myArray.sorted{[dateFormatter] one, two in 
    return dateFormatter.date(from:one["Time"])! > dateFormatter.date(from: two["Time"])! } 
+0

Non, vous n'avez pas besoin de convertir la chaîne à ce jour dans ce cas, car les chaînes de date sont dans un format triable tel quel. – rmaddy

+0

FYI - le premier bit de code que vous avez posté ne fonctionnera pas puisque la chaîne '22-04-2017 00: 00: 00' ne correspond pas au spécificateur de format. Le spécificateur de format est correct, l'exemple de chaîne de date ne l'est pas. – rmaddy

+0

@rmaddy 10x. édité – Vyacheslav

0

code simple pour une sorte de tableau de dictionnaire avec la date

let formatter = NSDateFormatter() 
formatter.dateFormat = "MMM d, yyyy hh:mm a" 
formatter.locale = NSLocale(localeIdentifier: "en_US") 

let sorted = displayArray.sort { 
    formatter.dateFromString($0["fullfireDate"] as! String)?.compare(formatter.dateFromString($1["fullfireDate"] as! String)!) != .OrderedAscending 
    } 
0
//Sort any dictionary with string dates using any date format 
var incisions = [["initials": "B.B. ", "date": "12/18/17 09:39 AM", "patientID": "snowball"], ["patientID": "snowball", "date": "01/03/18 04:03 PM", "initials": "C.J."], ["initials": "B.B. ", "date": "01/04/18 09:47 AM", "patientID": "snowball"]] 

func sortArrayDictDescending(dict: [Dictionary<String, String>], dateFormat: String) -> [Dictionary<String, String>] { 
       let dateFormatter = DateFormatter() 
       dateFormatter.dateFormat = dateFormat 
       return dict.sorted{[dateFormatter] one, two in 
        return dateFormatter.date(from: one["date"]!)! > dateFormatter.date(from: two["date"]!)! } 
      } 

    //use: 
let sortedArray = sortArrayDictDescending(dict: incisions, dateFormat: "MM/dd/yy a") 

for i in sortedArray { 
print("incisions \(i["date"]!)") 
} 

//output: 
incisions 01/04/18 09:47 AM 
incisions 01/03/18 04:03 PM 
incisions 12/18/17 09:39 AM