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>