2017-03-24 3 views
0

Ich habe meine list mit Objekten nach der Eigenschaft time, die String ist nicht date.Ersetzen Sie die Zeichen in der Liste der Zeichenfolgen

Die Beispielausgabe vor dem Sortieren:

07:05:10 AM 
07:05:01 AM 
07:04:49 AM 
07:04:44 AM 
06:53:58 AM 
06:53:47 AM 
01:03:21 AM 
12:03:21 AM 

und nach dem Aufruf instrudtion:

self.myList = self.myList.sorted { $0.mytime < $1.mytime } 

gehen sieht wie folgt aus:

01:03:21 AM 
06:53:47 AM 
06:53:58 AM 
07:04:44 AM 
07:04:49 AM 
07:05:01 AM 
07:05:10 AM 
12:03:21 AM 

Könnte ich 12:03:21 AM-00:03:21 AM nur ersetzen, wenn es ist AM und 12 am Anfang?

Oder gibt es andere Möglichkeiten, dies zu tun?

Vielen Dank im Voraus!

+4

Dies ist ein XY-Problem. Sie sollten Daten nicht basierend auf einer * string * -Darstellung vergleichen. Konvertiere sie stattdessen in "Date" (oder einen numerischen Zeitstempel). –

+0

12:03 AM und 00:03 AM ist nicht die gleiche Zeit –

+1

Sie sortieren es nicht richtig. Es sollte zuerst basierend auf der am/pm sortieren, dann können Sie basierend auf dem Präfix (Zeit) sortieren. Ich würde die Daten zuerst sortieren und die Zeichenfolge später erhalten. –

Antwort

1

Ich denke, das ist, was Sie suchen. Vergleichen Sie die Daten immer auf diese Weise!

override func viewDidLoad() { 
    super.viewDidLoad() 
    var arrayOfDates = ["07:05:10 AM", 
         "07:05:01 AM", 
         "07:04:49 AM", 
         "07:04:44 AM", 
         "06:53:58 AM", 
         "06:53:47 AM", 
         "01:03:21 AM", 
         "12:03:21 AM"] 

    // This will throw an error if any of your dates are 
    // misformatted, so handle that appropriately.     
    arrayOfDates.sort() { $0.toDate()!.compare($1.toDate()!) == ComparisonResult.orderedDescending } 
    print("Descending: \(arrayOfDates)") 

    arrayOfDates.sort() { $0.toDate()!.compare($1.toDate()!) == ComparisonResult.orderedAscending } 
    print("Ascending: \(arrayOfDates)") 
} 

extension String { 
    func toDate() -> Date? { 
    let formatter = DateFormatter() 
    formatter.dateFormat = "hh:mm:ss a" 
    if let date = formatter.date(from: self) { 
     return date 
    } else { 
     return nil 
    } 
} 

//If you need a string version of the date you can use this as well 
extension Date { 
    func toString() -> String { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "hh:mm:ss a" 
     return formatter.string(from: self) 
    } 
} 
+0

Haben Sie versucht, das zu kompilieren? –

+0

Danke! Genau das, was ich wollte. Ich habe danach gesucht. Ich meine, während ich eine Lösung mit Looping gemacht habe, aber es sieht schmutzig aus. Ich werde bei Ihrer Implementierung bleiben :) – yerpy

+0

@MartinR Nein, habe ich nicht .... Ich schrieb es aus dem Speicher. Gibt es ein Problem damit? Es benutzt Code, den ich täglich benutze, wenn es also einen Bug gibt, ist es klein. – Sethmr

Verwandte Themen