Вы можете передать sort
блок и реализовать там логи сравнения c, например:
var array = ["02:00 AM", "01:12 AM", "01:00 PM", "01:01 AM", "01:01 PM", "03:00 AM", "12:15 AM", "12:30 AM", "12:01 PM", "12:30 PM" ]
array.sort { s1, s2 in
let isAM1 = s1.contains("AM")
let isAM2 = s2.contains("AM")
return isAM1 && !isAM2 || ((isAM1 == isAM2) && s1 < s2)
}
Блок сравнения должен возвращать true
тогда и только тогда, когда первый аргумент должен быть отсортировано до второго. Это реализовано здесь так, что либо первое - AM, а второе - PM, либо оба имеют одинаковый AM / PM, а первое имеет более раннее время.
PS. Вы можете рассмотреть возможность использования Date
объектов вместо строки в первую очередь (вы всегда можете отформатировать их обратно в строки при необходимости).
Редактировать : Если в ваших строках используется соглашение, в котором "12:00 PM" - полдень, а "12 : 00:00 "полночь, такие времена будут неправильно отсортированы по вышеуказанному. Вы можете исправить это, протестировав s1.hasPrefix("12:")
и инвертировав статус «is AM»:
if s1.hasPrefix("12:") {
isAM1 = !isAM1
}
if s2.hasPrefix("12:") {
isAM2 = !isAM2
}
Даже при таком подходе сортировка 12:59 AM
последняя вместо прямой перед 01:00 AM
- вы можете точно Настройте сравнение, если это проблема. Однако я думаю, что одна эта сложность является достаточной причиной для использования Date
объектов (или ваших собственных Comparable
временных держателей), а не строк. Предполагая, что вы не хотите переходить на 24-часовые часы. =)