0
votes

Trier NssorteDescriptor en mois de date. Rapide

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>


1 commentaires

Merci j'essayais cela, mais cela donne maintenant à cette erreur: "Le type d'expression est ambigu sans plus de contexte"


3 Réponses :


0
votes

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 anniversaire.birtmmonth code> chemin de clé.

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>

ForEach(birthdays.sorted { $0.month < $1.month }, id: \.self) { birthday in


1 commentaires

«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



0
votes

Une solution possible est cette extension de nsdate ( nsdate est crucial car les données de base sont largement nsobject-kvo basées).

Il calcule la prochaine occurrence d'une date quelle que soit l'année xxx

Le descripteur de tri correspondant est xxx


10 commentaires

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."


C'est un peu ambigu: Je veux les trier d'une manière qui commence avec janvier et se termine avec décembre


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 {


Ajouter dynamique , bien que j'utilise le même motif avec succès sans dynamique .


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?



0
votes

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)
        }
    }
}


9 commentaires

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 .Element' (AKA 'Anniversaire') et «Date» Soyez équivalent à Veach (anniversaire. SoyedByComingBirthDay (), ID: \ .ft) {anniversaire dans


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}


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 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?