2016-07-03 23 views
11

Mam tablicę zawierającą obiekt o nazwie HistoryObject i ma właściwości takie jak „date”, „nazwa”, itpSortowanie obiektów w szyku według daty

Mam sortowania tablica tak:

let sortedArray = HistoryArray.sort({ $0.date.compare($1.date) == NSComparisonResult.OrderedDescending}) 

która ma sortować datę od nowszej do najstarszej. Na przykład:

  • 30 czerwca 2016
  • cze 29, 2016

etc ..

Ale kiedy moja tablica zawiera "02 lipca 2016" posortowanej tablicy staje:

  • 30 czerwca 2016
  • 29 czerwca 2016
  • lip 2, 2016

Gdzie "02 lipca 2016" powinna być na górze po sortowaniu, teraz jest na dnie? Jak mogę rozwiązać ten problem?

+0

Czy ponownie użyłeś funkcji sortowania? Nie można tego ustawić automatycznie. Jedynym sposobem na posortowanie go za każdym razem, gdy dodasz nowy obiekt, możesz utworzyć rozszerzenie tablicy i za każdym razem, gdy użyjesz AddObject na przykład, musisz wywołać tę funkcję sortowania. –

+0

Mam na myśli to, że po uzyskaniu pełnej tablicy od api, sortuję całą tablicę z jej obiektami, co oznacza, że ​​nie dodaję obiektów po sortowaniu. ale nie sortuje go poprawnie. @AltimirAntonov –

+0

Konwertuj ciąg znaków na NSDate jako pierwszy. Napiszę odpowiedź w kilka minut. –

Odpowiedz

23

Stosując Swift 4 & Swift 3

let testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"] 
var convertedArray: [Date] = [] 

var dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd" 

for dat in testArray { 
    let date = dateFormatter.date(from: dat) 
    if let date = date { 
     convertedArray.append(date) 
    } 
} 

var ready = convertedArray.sorted(by: { $0.compare($1) == .orderedDescending }) 

print(ready) 

Stosując Swift 2

Na przykład można mieć tablicę daty i kolejny 1 tablicę, w której można zapisać przekonwertowane termin:

var testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"] 
var convertedArray: [NSDate] = [] 

Następnie przekształcamy daty:

var dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd" 

for dat in testArray { 
    var date = dateFormatter.dateFromString(dat) 
    convertedArray.append(date!) 
} 

A wynik:

var ready = convertedArray.sort({ $0.compare($1) == .OrderedDescending }) 

print(ready) 
10

Dla Swift 3

var testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"] 
var convertedArray: [Date] = [] 

var dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "dd/MM/yyyy" 

for dat in testArray { 
    var date = dateFormatter.date(from: dat) 
    convertedArray.append(date!) 
} 

//Approach : 1 
convertedArray.sort(){$0 < $1}  

//Approach : 2 
convertedArray.sorted(by: {$0.timeIntervalSince1970 < $1.timeIntervalSince1970}) 

print(convertedArray) 
1

Unikanie dodatkową zmienną convertedArray

Korzystanie Swift 4 & Swift 3

let testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"] 

var dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd" 

var ready = convertedArray.sorted(by: { dateFormatter.date(from:$0).compare(dateFormatter.date(from:$1)) == .orderedDescending }) 

print(ready) 
Powiązane problemy