2016-07-03 4 views
11

У меня есть массив, содержащий объект с именем HistoryObject и имеет такие свойства, как «дата», «имя» и т.д.Сортировка объектов в массиве по дате

Я сортировки массива следующим образом:

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

, который должен сортировать дату от более старой до самой старой. Например:

  • 30 июня 2016
  • Июнь 29, 2016

и т.д ..

Но когда мой массив содержит "2 июля 2016" отсортированный массив становится:

  • 30 июня 2016
  • 29 июня 2016
  • июля 2, 2016

Где «2 июля 2016» должен быть на вершине после сортировки, в настоящее время он находится на дне? Как я могу исправить эту проблему?

+0

Вы снова использовали функцию сортировки? Это невозможно установить автоматически. Единственный способ отсортировать его каждый раз, когда вы добавляете новый объект, вы можете создать расширение массива, и каждый раз, когда вы используете AddObject, например, вы должны вызвать эту функцию сортировки. –

+0

Я имел в виду после получения полного массива из api, я сортирую весь массив с его объектами, то есть я не добавляю объекты после сортировки. но не сортировать его правильно. @AltimirAntonov –

+0

Сначала конвертировать строку в NSDate. Я напишу ответ через несколько минут. –

ответ

23

Использование 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) 

Использование Swift 2

Например у вас есть массив с датами и еще 1 массив, в котором вы будете сохранять преобразованные даты:

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

После этого мы преобразуем даты:

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

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

И результат:

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

print(ready) 
10

Для 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

избежать дополнительной переменной convertedArray

Использование 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) 
Смежные вопросы