0

J'essaie de trier un tableau d'objets personnes. La classe ressemble à ceci.Comment devrais-je corriger ce code?

Person 
------- 
name 
phone 

J'ai un NSMutableArray rempli avec ces objets. Je veux trier ce tableau par le nom de chaque objet personnel.

C'est le code que j'ai essayé.

NSSortDescriptor *desc = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES]; 
[personArray sortedArrayUsingDescriptors: [NSMutableArray arrayWithObject: desc]]; 

Cela ne fonctionne pas. Comment peut-il être changé pour travailler?

+0

Je sais qu'une réponse a déjà été postée et qu'elle est probablement correcte, mais comme un mot d'ordre général: "ça ne marche pas" n'est pas très utile. Vous devez dire ce qui est exactement brisé. Par exemple "personArray reste unsorted" aurait une réponse totalement différente à "obtenir l'exception NSCFString ne répond pas à -sortedArrayUsingDescriptors". – JeremyP

Répondre

3

Vous savez que sortedArrayUsingDescriptors: renvoie un nouveau tableau (trié), correct? Si vous souhaitez trier le tableau sur place, vous devez vous assurer que personArray est un NSMutableArray et utiliser sa méthode sortUsingDescriptors:.

modifier

Peut-être prendre un regard sur les deux méthodes seront plus bénéfiques:

-[NSArray sortedArrayUsingDescriptors:]; 
-[NSMutableArray sortUsingDescriptors:]; 

Le premier commence par un adjectif et un nom. L'adjectif décrit le nom. Le nom indique que c'est la valeur de retour. Puisque le nom est "tableau", il serait logique que la valeur de retour de la méthode soit NSArray. Puisque l'adjectif est "trié", on peut donc supposer que le tableau retourné sera dans un ordre quelconque (l'ordre étant spécifié par "l'utilisation" des "descripteurs").

La seconde commence par un verbe. Puisqu'un verbe est un mot d'action, nous pouvons en déduire qu'il s'agit en fait d'une méthode comportementale qui va modifier le récepteur lui-même. Puisque le verbe est "trier", nous pouvons donc supposer que le récepteur sera dans un ordre quelconque après la fin de la méthode.

Autres "paires de méthode" qui suivent ce modèle:

  • -[NSString stringByAppendingString:] et -[NSMutableString appendString:]
  • -[NSArray filteredArrayUsingPredicate:] et -[NSMutableArray filterUsingPredicate:]
  • -[NSCharacterSet invertedSet] et -[NSMutableCharacterSet invert]
  • ... et bien d'autres

Puisque vous êtes chantez la première méthode (sortedArrayUsingDescriptors:), vous devez récupérer la valeur de retour de la méthode; sinon tu fais tout ce travail pour rien. Si vous voulez trier le tableau « en place » (c.-à modifier directement le récepteur et ne être donné une nouvelle NSArray), puis personArraydoit être un NSMutableArray, et vous devez utiliser la méthode sortUsingDescriptors:.

+0

N'est-ce pas ce que j'ai fait? personArray est un objet NSMutableArray d'objets personnels.J'essaie de trier par le nom à l'intérieur de l'objet personne. –

+1

@awakeFromnib: Non, ce n'est pas ce que vous avez fait. Vous avez appelé 'sortedArrayUsingDescriptors:' au lieu de 'sortArrayUsingDescriptors:' ... yours commence par "trié", sa suggestion commence par "sort". – imaginaryboy

+0

pour clarifier le commentaire de imaginaryboy: sortedArray ... crée un nouveau tableau, laissant l'original non trié. sortArray ... trie le tableau source. – codelark