Добавить тег в NSMutableArray
Можно ли установить тег для NSMutableArray? Я должен как-то определить, в массиве массивов, один массив, который нужно переписать, и если бы я мог просто установить тег для этого внутреннего массива в 1 (или другое число), это было бы чрезвычайно легко.
Пример:
NSMutableArray* outerArray = [NSMutableArray new];
NSMutableArray* innerArray1 = [NSMutableArray new];
NSMutableArray* innerArray2 = [NSMutableArray new];
NSMutableArray* innerArray3 = [NSMutableArray new];
NSMutableArray* innerArray4 = [NSMutableArray new];
[outerArray addObject:innerArray1];
[outerArray addObject:innerArray2];
[outerArray addObject:innerArray3];
[outerArray addObject:innerArray4];
//now let's say innerArray1 needs to be rewritten
//I would like to be able to do this
[innerArray1 setTag:100];
//then later, when I need to determine which of the arrays inside outerArray
//needs to be rewritten, I can just do this
for(NSMutableArray* temp in outerArray) {
if(temp.tag == 100) {
//do what I need to do
}
}
Но вы не можете использовать setTag:
с NSMutableArrays. Что бы обойти?
5 ответов
Массивы - это упорядоченные коллекции, так почему бы вам просто не отслеживать, какой индекс нужно переписать.
Когда происходит что-то такое, что необходимо записать массив с индексом 0 (который, в вашем примере, будет innerArray1) внешнего массива, кэш-индекс 0 - как свойство, если эта подпрограмма должна охватывать отдельные методы.
Затем, когда придет время переписать, обратитесь к кешированному индексу. Получите массив, который будет переписан следующим образом: NSArray *arrayToRewrite = [outerArray objectAtIndex:cachedIndexToRewrite];
Или получить к нему доступ напрямую: [[outerArray objectAtIndex:cachedIndexToRewrite] replaceObjectAtIndex:whatever withObject:whatever];
Вы могли бы использовать NSMutableDictionary
вместо. "Тег" будет просто ключом, а массив - значением.
Используйте связанные объекты. Вы даже можете добавить категорию в NSMutableArray, которая добавит tag
собственность им.
@interface NSMutableArray (TagExtension)
@property (nonatomic, assign) NSInteger tag;
@end
@implementation NSMutableArray (TagExtension)
@dynamic tag;
static char TagExtensionKey;
-(NSInteger)tag {
NSNumber *ourTag = (NSNumber *)objc_getAssociatedObject(self, &TagExtensionKey);
if( ourTag ) {
return( [ourTag integerValue] );
}
return(0);
}
-(void)setTag:(NSInteger)newTag {
objc_setAssociatedObject(self, &TagExtensionKey, [NSNumber numberWithInteger:newTag], OBJC_ASSOCIATION_RETAIN);
}
@end
Смотрите также: Как добавить свойства в NSMutableArray через расширение категории?
Не уверен, почему словарь плохая идея здесь... в качестве альтернативы, вы можете:
- помните индекс
или если каждая запись является уникальным массивом, вы можете просто обратиться к нему по указателю:
NSArray * tagged = theArray;
for (NSMutableArray * at in outerArray) { if (tagged == at) { //do what I need to do } }
Сделайте ваши внутренние переменные класса массивов. Тогда вы можете просто получить к ним доступ как:
for(NSMutableArray* temp in outerArray) {
if(temp == self.innerArray1) {
//do what I need to do
}