Voilà, je suis enfin arrivé à ce que je souhaitais! :grin:
Tout d’abord, merci à tous ceux qui ont pris le temps de me répondre dans cette longue quête! 
Donc, petit récapitulatif du résultat attendu:
J’avais en base de donnée des courses (Races) que je souhaitais afficher dans une TableView de la course la plus récente vers la plus ancienne. Je souhaitais également classer ces courses sous différentes sections (une section correspondant à une date).
Par exemple, si j’avais comme courses:
{ Race("race 1", date: "05-02-2018 11:40:32"), Race("race 2", date: "06-02-2018 11:40:32"), Race("race 3", date: "06-02-2018 15:40:32"), Race("race 4", date: "07-02-2018 11:40:32"), Race("race 5", date: "07-02-2018 17:42:18") }
Je souhaitais arriver à:
-- 07/02/2018 --
Race 5
Race 4
-- 06/02/2018 --
Race 3
Race 2
-- 05/02/2018 --
Race 1
Voici mon code source:
Je reste ouvert à toutes idées d’amélioration (performance, lisibilités, explications, etc
)
Code de ma TableView:
Dans mon TableViewController:
var _races:Results<Race>?
var _racesByDates:[[Race]]?
override func viewWillAppear(_ animated: Bool) {
_races = RacesManager.getRaces()
if let races = _races {
_racesByDates = RacesManager.getRacesByDistinctsDates(races: races)
}
}
Code de la TableView à proprement parlé:
extension MyTableViewController {
override func numberOfSections(in tableView: UITableView) -> Int {
guard let numberOfDistinctRacesDates = _racesByDates?.count else {
return 1
}
return numberOfDistinctRacesDates
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if let date = _racesByDates?[section][0].date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
return dateFormatter.string(from: date)
}
return nil
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let distinctRaceDateAtRow = _racesByDates?[section] {
return distinctRaceDateAtRow.count
}
return 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let race:Race = _racesByDates?[indexPath.section][indexPath.row],
let missionRace = race.getMission(),
let missionLabel = missionRace.getLabel() else {
return UITableViewCell()
}
let title = "\(race.label)"
let subtitle = "\(race.date)"
if let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as? MyCellModel {
cell.commonInit(title: title, subtitle: subtitle)
return cell
}
return UITableViewCell()
}
}
Le code de mon RaceManager (où se trouve la gestion des divisions des courses en fonction des dates):
static func getRacesByDistinctsDates(races:Results<Race>) -> [[Race]]? {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
// Récupère un tableau de String qui contient les dates de manière unique triée par ordre décroissant
let distinctsDates:[String] = Set((races.value(forKey: "date") as! [Date]).map { (date:Date) -> String in
dateFormatter.string(from: date)
}).sorted(by: >)
var racesByDistinctsDates:[[Race]] = []
// Parcourt des dates uniques
for date in distinctsDates {
// Ajoute les bonnes courses aux bonnes dates dans le tableau des courses à retourner
let distinctsRaces = races.reduce(into: [Race]()) { (result, race:Race) in
let raceDate = dateFormatter.string(from: race.date)
if raceDate == date {
result.append(race)
}
}
racesByDistinctsDates.append(distinctsRaces)
}
return racesByDistinctsDates
}
Dernière petite question:
Pour le moment, j’utilise
sorted(by: >)
pour trier mes dates (sous forme de String) dans un ordre décroissant (date la plus récente en haut, la plus ancienne en bas).
Cela fonctionne, mais je ne suis pas sur que cela fonctionnera tout le temps.
Votre avis ?
Voilà voilà, si vous avez des remarques, ou autres, n’hésitez pas 
Encore un grand merci 
Alexandre