Bonjour les gars, j'ai struct Datas () qui contient le champ start avec la date. J'ai 24 objets et je souhaite les ajouter à la collection et trier la collection par heure (champ .start ). J'ai essayé les réponses de la pile, mais ce n'est pas mon cas.
private func configureCell(collectionView: UICollectionView, indexPath: IndexPath) -> UICollectionViewCell { let availableSessionTimeCell = collectionView.dequeueReusableCell(withReuseIdentifier: availableSessionCell, for: indexPath) as! EVAvailableSessionTimeCell let dataItem = todaysTimes[clinicSection[indexPath.section]!]![indexPath.row] availableSessionTimeCell.dateLabel.text = Date.time(day: dataItem.start) return cell }
configurer la cellule
var todaysTimes = [Int:[Datas]]() struct Datas { var id: Int var isVisited: Bool var start: Date var end: Date }
3 Réponses :
Vous devez trier votre tableau avant d'appeler configureCell. Donc, dans votre méthode viewDidLoad, vous devriez utiliser quelque chose comme ceci.
dates.sort(by: {(p1: Datas, p2: Datas) -> Bool in return p1.start > p2.start })
Après cela, vous êtes prêt à partir.
Malheureusement, le tri d'un dictionnaire est plus difficile à réaliser. P >
Il est abordé dans cette question .
Comme je l'ai compris, vous souhaitez trier le tableau des données d'objets dans votre dictionnaire. Mais ne triez pas le dictionnaire
lui-même. Si vous souhaitez trier chaque valeur
(qui est [Datas]
) dans votre dictionnaire valeur-clé
puis dans votre viewDidLoad ()
vous pourriez probablement trier le tableau de vos données pour qu'il soit comme vous le souhaitez (soit croissant
ou décroissant
).
Vous pouvez y parvenir en effectuant une boucle dans votre dictionnaire et en triant les valeurs de la manière suivante:
struct Datas { var id: Int var isVisited: Bool var start: Date var end: Date } // Dump data to show an example var todaysTimes = [Int:[Datas]]() let today = Date() let one_day_before_today = Calendar.current.date(byAdding: .day, value: -1, to: today)! let two_day_before_today = Calendar.current.date(byAdding: .day, value: -2, to: today)! todaysTimes[1] = [Datas(id: 1, isVisited: false, start: one_day_before_today, end: Date()), Datas(id: 1, isVisited: false, start: today, end: Date()), Datas(id: 1, isVisited: false, start: two_day_before_today, end: Date())] // Sort Descending print("Sorted descending") for (id, datas) in todaysTimes { todaysTimes[id] = datas.sorted(by: { $0.start.compare($1.start) == .orderedDescending }) } print(todaysTimes) // Sort Ascending print("Sorted ascending") for (id, datas) in todaysTimes { todaysTimes[id] = datas.sorted(by: { $0.start.compare($1.start) == .orderedAscending }) } print(todaysTimes) // Will print these two lines // Sorted descending // [1: [SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-21 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-20 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-19 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000)]] // Sorted ascending // [1: [SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-19 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-20 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-21 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000)]] // Try the example in online.swiftplayground.run
Pour un exemple complet, vous peut essayer ceci dans http://online.swiftplayground.run/ :
for (id, datas) in todaysTimes { todaysTimes[id] = datas.sorted(by: { $0.start.compare($1.start) == .orderedDescending }) }
Vous devez simplement utiliser une combinaison de forEach (_ :)
et sorted (_ :)
pour que cela fonctionne, c'est-à-dire
let newValue = value.sorted(by: { $0.start > $1.start })
Si vous souhaitez le trier par ordre décroissant , utilisez simplement >
au lieu de , c'est-à-dire
var todaysTimes = [Int:[Datas]]() todaysTimes.forEach { (key,value) in let newValue = value.sorted(by: { $0.start < $1.start }) //will sort in ascending order todaysTimes[key] = newValue }
Double possible du iOS swift 4 trie le dictionnaire par une valeur particulière a>