Vous devrez utiliser KVC . Mais comment s'y prendre ? Après tout, NSMutableArray n'est pas compatible avec le Key-Value-Coding pour ses méthodes de mutation ou les changements de contenu. La réponse est la procuration, car la sous-classification de NS[Mutable]Array est beaucoup trop compliquée.
NSProxy est une petite classe géniale que vous pouvez utiliser pour intercepter les messages envoyés à votre tableau comme si vous étiez un NSMutableArray, puis les transmettre à une instance interne. Malheureusement, elle n'est pas non plus compatible avec KVC, car les rouages de KVC se trouvent dans NSObject. Nous devrons donc l'utiliser. Un exemple d'interface pourrait ressembler à ceci :
@interface CFIKVCMutableArrayProxy : NSObject {
NSMutableArray *_innerArray;
}
- (NSUInteger)count;
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
- (void)removeObjectAtIndex:(NSUInteger)index;
- (void)addObject:(id)anObject;
- (void)removeLastObject;
- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
//…
@end
Comme vous pouvez le voir, nous simulons une interface de NSMutableArray
ce qui est nécessaire, car notre proxy doit tout mettre en œuvre comme s'il était un NSMutableArray
. Cela rend également l'implémentation aussi simple que possible, puisque nous pouvons simplement transmettre les sélecteurs à notre module interne NSMutableArray
pointeur. Pour des raisons de brièveté, je n'implémenterai que deux méthodes pour vous montrer à quoi ressemble un schéma général :
@implementation CFIKVCMutableArrayProxy
//…
- (NSUInteger)count {
return _innerArray.count;
}
- (void)addObject:(id)anObject {
[self willChangeValueForKey:@"count"];
[_innerArray addObject:anObject];
[self didChangeValueForKey:@"count"];
}
- (void)removeLastObject {
[self willChangeValueForKey:@"count"];
[_innerArray removeLastObject];
[self didChangeValueForKey:@"count"];
}
@end
Si vous n'avez pas la possibilité d'envelopper un tableau de cette façon, alors essayez de repenser votre code. Si une dépendance externe vous contraint à ce genre de situation, essayez de la supprimer. C'est toujours une mauvaise chose de travailler autour de ses propres outils.