Objectif C - Subclassing NSArray
-
08-10-2019 - |
Question
Je suis en train de sous-classe NSArray
, mais il se bloque l'application lorsque vous essayez d'accéder à la méthode de comptage. Je sais que NSArray
est groupe classe .
- Mais qu'est-ce que cela veut dire?
- Y at-il un travail autour de pouvoir sous-classe NSArray?
Je sais que je peux simplement sous-classe NSObject
et que mon tableau comme une variable d'instance, mais je NSArray
plutôt sous-classe.
EDIT:
Raison:
Je crée un jeu de cartes, j'ai un Deck
de classe qui devrait sous-classe NSMutableArray
d'avoir deux ou trois méthodes supplémentaires (-shuffle
, -removeObjects:
, -renew
, etc.), et je pense qu'il regardera plus propre à la sous-classe NSArray
plutôt que d'avoir un var.
La solution
Le problème avec l'ajout d'une catégorie sur cette classe comme est que toutes les instances de la classe héritent des méthodes supplémentaires. C'est à la fois inutile (car tous les besoins du tableau pour pouvoir être brassé, etc.) et dangereux (parce que vous ne pouvez pas bénéficier de la vérification du type pour être sûr que le NSArray vous faites référence actuellement est vraiment celui qui devait être brassé ).
Une alternative serait de créer votre propre classe de plate-forme qui a une NSMutableArray comme une variable d'instance. Là, vous pouvez définir exactement comme des actions sur votre plate-forme que vous souhaitez, et le fait que vous utilisez un NSMutableArray devient un détail de mise en œuvre. Cela vous permet de profiter de la vérification du type à la compilation et il vous permet de modifier l'implémentation interne de votre classe de plate-forme sans changer ses clients. Par exemple, si vous avez décidé, pour une raison qu'un NSMutableDictionary serait un meilleur magasin de sauvegarde, vous pouvez faire tous ces changements dans la mise en œuvre de votre classe de plate-forme sans changer le code qui crée et utilise la plate-forme.
Autres conseils
En général, vous aurez pas besoin de sous-classe, mais en tout cas, les suggestions faites par Apple sont:
Toute sous-classe de NSArray doit remplacer les méthodes d'instance primitives
count
etobjectAtIndex:
. Ces méthodes doivent fonctionner sur le magasin de soutien que vous fournissez pour les éléments de la collection. Pour ce magasin de support, vous pouvez utiliser un tableau statique, un objet standard NSArray, ou un autre type de données ou d'un mécanisme. Vous pouvez également choisir de remplacer, partiellement ou totalement, toute autre méthode NSArray pour laquelle vous souhaitez fournir une implémentation alternative.
Est-ce réellement outrepasser le count
method? Comme ils disent que vous devez fournir votre propre structure de support aux éléments du tableau de maintien, et remplacer les méthodes proposées en tenant compte de cette ..
Si vous êtes juste d'ajouter de nouvelles méthodes, et en utilisant le magasin de support existant, une meilleure approche consiste à ajouter une catégorie à NSArray. Les catégories sont une partie très puissante de Objective-C - voir CocoaDev pour certains échantillons
. NSMutableArray
a déjà - (void)removeObjectsInArray:(NSArray *)otherArray;
Vous allez mieux loti faire une sous-classe NSObject avec une propriété de tableau mutable.
Dans ce cas particulier, je voudrais la lecture aléatoire tableau à l'aide -sortedArrayUsingComparator:
et rendre votre comparateur retour au hasard NSOrderedAscending
ou NSOrderedDescending
.
par exemple:
NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
^(id obj1, id obj2) {
return random() % 2 ? NSOrderedAscending : NSOrderedDescending;
}];