Je présente une liste d'anniversaires. Je veux les trier d'une manière qui commence avec janvier et se termine avec décembre et le deuxième NssorteDescriptor d'être le jour. s> Je souhaite afficher une liste avec les anniversaires les plus proches apparaissant en premier.
Il trie actuellement par la date d'anniversaire complète. Donc, actuellement "le 6 février 2009" s'affiche après "le 8 février 1997" que je ne veux pas que ce soit comme année-là est hors de propos lorsqu'il voulait savoir quand le prochain anniversaire apparaît. P>
Qu'est-ce que mon fetchrequest ressemble à : P>
@FetchRequest(entity: Birthday.entity(), sortDescriptors: [ NSSortDescriptor(keyPath: \Birthday.nextBirthday, ascending: true) ]) var birthdays: FetchedResults<Birthday>
3 Réponses :
Si vous avez (ou que vous allez avoir) une grande base de données, il serait approprié de définir un attribut dédié dans le modèle de données (par exemple, de naissance: chaîne, ayant quelque chose comme "mm / dd") et faire le moteur de tri de CoreData trier Pour vous par Sinon, dans le cas de la petite base de données, vous pouvez effectuer une station supplémentaire à la volée après la récupération des données, comme dans P> anniversaire.birtmmonth code> chemin de clé.
ForEach(birthdays.sorted { $0.month < $1.month }, id: \.self) { birthday in
«Quelque chose comme» Sep, 6 "'trier l'alphabétiquement. quels besoins op sont "mm / dd". Une autre chose à considérer est la date réelle de sorte que les dates de naissance au-delà (le mois dernier ou la semaine dernière) devraient aller à la fin
Une solution possible est cette extension de Il calcule la prochaine occurrence d'une date quelle que soit l'année p> Le descripteur de tri correspondant est p> nsdate code> (
nsdate code> est crucial car les données de base sont largement nsobject-kvo em> basées).
Cela ne prendrait pas en compte la date actuelle
Je ne comprends pas.
OP aimerait trier le prochain anniversaire. Cela trierait les anniversaires qui sont déjà arrivés cette année avant que ceux qui arrivent encore. "Pour savoir quand le prochain anniversaire arrive." B>
C'est un peu ambigu: Je veux les trier d'une manière qui commence avec janvier et se termine avec décembre i>
Vous auriez besoin de changer cette propriété pour retourner le nombre de jours d'aujourd'hui jusqu'au prochain anniversaire
Peut-être utiliser Sundate pour les composants mois et jour après aujourd'hui
"Je veux les trier d'une manière qui commence par janvier et se termine avec décembre" Ouais, je me suis révélé que ce que je voulais dire était les anniversaires les plus proches apparaissent d'abord, mon mauvais.
La mise en œuvre de cela me donne l'erreur suivante: thread 1: Exception: "[<__ NASTAGGEDDate 0x8A856BB81Bee234F> ValueForundEfineFineFine:]: cette classe n'est pas conforme à la valeur clé conformément au codage de la clé Suivoulement." AT Classe Appdelegate: UIPonder, UIAPplicationDelegate { code>
Ajouter dynamique code>, bien que j'utilise le même motif avec succès sans
dynamique code>.
Le code fonctionne maintenant, mais tit semble que les dates ne sont pas triées correctement. La liste affiche maintenant les dates de l'ordre de quand je les ai créées. Avec la dernière apparition la plus élevée sur la liste. Ensuite, lors de la reconstruction du code et reliant le simulateur IOS, il affiche la dernière création comme le plus bas de ce que cela a fait auparavant. Toute idée de ce qui se passe?
Vous pouvez créer un tri personnalisé pour obtenir vos dates triés en entrant anniversaire et transmettez votre collection triée sur votre méthode foreach:
extension Collection where Element == Birthday { func sortedByIncomingBirthday() -> [Element] { sorted { lhs, rhs in if lhs.date == nil { return false } let lhs = lhs.date ?? .distantFuture let rhs = rhs.date ?? .distantFuture // lhs date is today or is in the future return (lhs.month, lhs.day) >= (Date().month, Date().day) ? // rhs date is today or is in the future (rhs.month, rhs.day) >= (Date().month, Date().day) ? // sort them by a month day order (lhs.month, lhs.day) < (rhs.month, rhs.day) : // otherwise is in increasing order true : // lhs date is in the past // sort them by a month day order (lhs.month, lhs.day) < (rhs.month, rhs.day) } } }
La mise en œuvre de cela donne l'erreur suivante: Méthode d'instance de référencement «Trié de la collection» sur 'Collection' nécessite les types 'FetchedResults Veach (anniversaire. SoyedByComingBirthDay (), ID: \ .ft) {anniversaire dans code>
Oui, il donne l'erreur suivante à la ligne NSSORTDEScriptor: fil 1: erreur fatale: impossible d'extraire une chaîne de KeyPath Swift.KeyPathe
Qu'en est-il de la première approche?
@Shackkill Pouvez-vous s'il vous plaît éditer votre message et montrer ce que vous avez essayé?
@Shackkill ne forcez pas la date de démoulage. Essayez var nextbirthday: date {date? .Nextbirthdayday ?? .Distantfuture} code>
Avec votre première solution, j'ai fait un anniversaire avec le même jour et la même année de janvier à juillet. Tous apparaissent afin qu'ils apparaissent dans le calendrier annuel, sauf lorsque j'ai fait de juillet, il se pose entre février et mars Liste ressemble au: 15 janvier du 15 février du 15 juillet 15 mars du 15 mai du 15 juin du 15 juin 15 juin.
Je l'ai testé ici avec toutes sortes de dates et cela fonctionne comme prévu. Pouvez-vous s'il vous plaît mettre à jour votre message?
@Shackkill en fait si la date était nil code> il n'était pas trié mais je l'ai réparé. Maintenant, si la date est nulle, il arrive à la fin de la matrice
Que dois-je définir pour NssortDescriptor?
Merci j'essayais cela, mais cela donne maintenant à cette erreur: "Le type d'expression est ambigu sans plus de contexte"