Добавить тег в 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 через расширение категории?

Не уверен, почему словарь плохая идея здесь... в качестве альтернативы, вы можете:

  1. помните индекс
  2. или если каждая запись является уникальным массивом, вы можете просто обратиться к нему по указателю:

    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
}
Другие вопросы по тегам