2010-09-09 7 views
2

Je tente d'ajouter une catégorie à NSMutableArray pour me permettre de l'utiliser comme un tableau 2D (soutenu par le tableau 1D, avec une méthode pour convertir x & y indices en un index plat). Comme je ne suis pas autorisé à ajouter des variables d'instance à une catégorie, comment dois-je faire le suivi des nombres de lignes et de colonnes nécessaires pour calculer l'indice dans le tableau?Catégories et variables d'instance

Voici l'interface:

@interface NSMutableArray (TK2DMutableArray) 
- (id) initWithColumns:(int) columns rows:(int) rows; 
- (id) objectAtColumn:(int) col row:(int) row; 
- (void) putObject:(id) object atColumn:(int) x Row:(int) y; 
@end 

Et voici la mise en œuvre:

@implementation TK2DMutableArray 

- (id) initWithColumns:(int) x rows:(int) y { 
    self = [self initWithCapacity:x * y]; 

    return self; 
} 

- (id) objectAtColumn:(int) col row:(int) row { 
    return [self objectAtIndex:[self indexAtColumn:col row:row]]; 
} 

- (void) putObject:(id) object atColumn:(int) x row:(int) y { 
    [self replaceObjectAtIndex:[self indexAtColumn:x row:y] withObject:object]; 
} 

- (int) indexAtColumn:(int) col row:(int) row { 
    return (col + (row * rows)); 
} 

@end 

I codé à l'origine il comme une sous-classe de NSMutableArray; Je sais maintenant que c'était une erreur d'avoir lu un peu sur les grappes de classe. Le problème est là dans la dernière méthode - que dois-je faire avec rows? Ce serait un vieil ivar si j'étais sous-classe.

Je m'attends à ce qu'on me dise de créer une nouvelle classe avec une NSMutableArray comme propriété, mais je voulais voir s'il y avait un moyen de le faire avec les catégories en premier.

Merci beaucoup.

+0

duplication possible de [Objective-C: Variable d'instance dans la catégorie] (http://stackoverflow.com/questions/6162589/objective-c-instance-variable-in-category) – hfossli

Répondre

4

Sur 10.6 et versions ultérieures (je ne suis pas sûr d'iOS), vous pouvez utiliser objc_setAssociatedObject pour associer des choses arbitraires à un objet, voir this Apple doc. Vous pouvez utiliser ce mécanisme pour "ajouter" et ivar.

Mais je pense qu'il est préférable pour vous de créer une nouvelle classe avec NSMutableArray comme propriété. De cette façon, vous pouvez distinguer un tableau 1d et un tableau 2d au niveau des types, afin que le compilateur puisse vous avertir. Par exemple, vous ne voulez pas utiliser accidentellement objectAtIndex: sur un tableau 2d, non?

+0

OK, merci d'essayer. Les associations peuvent fonctionner mais je suis d'accord avec vous: une nouvelle classe. –

2

Si vous avez vraiment besoin d'une classe qui a l'interface de NSMutableArrayet vos opérations de tableau 2d vous devriez probablement sous-classe NSMutableArray. Comme il s'agit d'un cluster de classe, vous devez également implémenter les opérations primitives NSArray et NSMutableArray. Il s'agit des count, objectAtIndex:, insertObject:atIndex:, removeObjectAtIndex:, addObject:, removeLastObject et replaceObjectAtIndex:withObject: ainsi que des init -Méthodes dont vous avez besoin. Vous pouvez ensuite implémenter le stockage vous-même ou simplement les transférer vers une variable d'instance NSMutableArray.

Mais vous êtes probablement mieux avec une nouvelle classe pour vos tableaux 2D comme Yuji l'a suggéré.

+0

Merci pour la réponse détaillée Sven. C'est beaucoup trop de travail pour une exigence aussi simple. Une nouvelle classe avec le backing array en ivar fonctionnera bien, mais c'est bien d'avoir la liste complète ici si j'en avais besoin pour quelque chose d'autre. –

Questions connexes