Как упростить мой код ... 2D NSArray в Objective C ...? - PullRequest
0 голосов
/ 06 апреля 2010
 self.myArray = [NSArray arrayWithObjects: [NSArray arrayWithObjects: [self generateMySecretObject], [self generateMySecretObject],nil], [NSArray arrayWithObjects: [self generateMySecretObject], [self generateMySecretObject],nil],nil]; 

 for (int k=0; k<[self.myArray count]; k++) {
  for(int s = 0; s<[[self.myArray objectAtIndex:k] count]; s++){
   [[[self.myArray objectAtIndex:k] objectAtIndex:s] setAttribute:[self generateSecertAttribute]];
  }
 }

Как видите, это простой массив 2 * 2, но мне нужно много кода, чтобы назначить NSArray на самом первом месте, потому что я обнаружил, что NSArray не может назначить размер в самом начале. Также я хочу установить атрибут один за другим. Я не могу понять, изменится ли мой массив на 10 * 10. Как долго это может быть. Итак, я надеюсь, что вы, ребята, можете дать мне несколько советов по сокращению кода и сделать его более читабельным. ТГц

(Некоторые предположения: myArray будет иметь фиксированный размер. Он не будет расти или уменьшаться во время выполнения.)

Ответы [ 2 ]

2 голосов
/ 06 апреля 2010

Создать массив по -addObject:.

NSMutableArray* myArray = [NSMutableArray array];
for (int k = 0; k < 10; ++ k) {
  NSMutableArray* subArr = [NSMutableArray array];
  for (int s = 0; s < 10; ++ s) {
    id item = (s == 0 && k == 0) ? [self d] : [self generateMySecretObject];
    [item setAttribute:[self generateSecertAttribute]];
    [subArr addObject:item];
  }
  [myArray addObject:subArr];
  // use [myArray addObject:[[subArr copy] autorelease]] for deep immutability.
}
return [[myArray copy] autorelease];

(Не запрашивайте self.myArray много раз. Каждый из них соответствует вызову ObjC, и хотя кто-то вызывает вызов ObjC, он дешев, но все равно не бесплатный.)

1 голос
/ 06 апреля 2010

Если массив имеет фиксированный размер и каждая строка имеет одинаковую длину, вы можете использовать одномерный массив и смещение, например:

int rowLength = 5;
int rowNumber = 0;
int columnNumber = 3;

[myArray objectAtIndex: (rowLength * rowNumber) + columnNumber];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...