Objective-C - быстрое перечисление на подмножестве массива? - PullRequest
0 голосов
/ 11 июня 2011

Есть ли простой способ сделать быстрое перечисление для диапазона объектов в массиве? Что-то вроде ...

for (Object *object in myArray startingAtIndex:50) {
    //do stuff
}

... чтобы избежать необходимости делать что-то подобное ...

for (Object *object in myArray) {
    NSUInteger index = [myArray indexOfObject:object];
    if (index >= 50) {
        //do stuff
    }
}

Спасибо.

Ответы [ 2 ]

6 голосов
/ 11 июня 2011

Если myArray является неизменным, то subArrayWithRange: , вероятно, не копирует указатели, хотя retain , вероятно, по-прежнему необходимо отправлять всем в подмассив. 1008 *

В целом, это действительно не имеет значения. Честно говоря, я никогда не видел случая, чтобы быстрое перечисление по сравнению с indexOfObject: было достаточно проблемы с производительностью, чтобы привлечь внимание (всегда было что-то хуже.:).

другой подход; используйте enumerateBlock: и просто возвращайтесь из индексов из рейнджера (и используйте флаг остановки).

[myArray enumerateWithBlock: ^(id o, NSUInteger i, BOOL *f) {
   if (i < 10) return;
   if (i > 20) { *f = YES; return; }
   ... process objects in range ...
}];

(Вы могли бы даже использовать вариант options: для одновременного перечисления.)

5 голосов
/ 11 июня 2011

Это приходит мне в голову:

for (Object *object in [myArray subArrayWithRange:NSMakeRange(50, ([myArray count] - 49))]) {
    //do stuff
}

, который создает временный массив, и, следовательно, потенциально медленнее (измеряет его!), Чем ручное перечисление, например:

NSUInteger arrayCount = [myArray count];
for (NSUInteger i = 50; i < arrayCount; i++) {
    Object *object = [myArray objectAtIndex];
    // do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...