Добавить тег в NSMutableArray - PullRequest
1 голос
/ 12 февраля 2012

Можно ли установить тег для 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 ]

2 голосов
/ 12 февраля 2012

Массивы - это упорядоченные коллекции, так почему бы вам просто не отслеживать, какой индекс нужно переписать.

Когда что-то происходит так, что массив с индексом 0 (который в вашем примере будет innerArray1) внешнего массива должен быть записан, кэш-индекс 0 - как свойство, если эта подпрограмма должна охватыватьотдельные методы.

Затем, когда придет время переписать, сверьтесь с кэшированным индексом.Получите массив, который будет переписан следующим образом: NSArray *arrayToRewrite = [outerArray objectAtIndex:cachedIndexToRewrite]; Или получите к нему прямой доступ: [[outerArray objectAtIndex:cachedIndexToRewrite] replaceObjectAtIndex:whatever withObject:whatever];

2 голосов
/ 12 февраля 2012

Вы можете использовать вместо NSMutableDictionary. «Тег» будет просто ключом, а массив - значением.

1 голос
/ 12 февраля 2012

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

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

    NSArray * tagged = theArray;

    for (NSMutableArray * at in outerArray) {
      if (tagged == at) {
        //do what I need to do
      }
    }
    
1 голос
/ 12 февраля 2012

Использование связанных объектов.Вы даже можете добавить категорию в 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 через расширение категории?

0 голосов
/ 12 февраля 2012

Сделайте ваши внутренние переменные класса массивов.Тогда вы можете просто получить к ним доступ как:

for(NSMutableArray* temp in outerArray) {
if(temp == self.innerArray1) {
    //do what I need to do
}
...