2011-06-11 5 views
0

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

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

... чтобы избежать того, чтобы сделать что-то вроде этого ...

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

Спасибо.

ответ

5

Они приходят на ум:

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 
} 
+0

Какой бы быстрее должна быть определена профилированием. Метод 'subArrayWithRange:' может быть быстрее. – Sven

+0

Да, таким образом, «потенциально». ;) – Regexident

+0

Вы имеете в виду «i DenverCoder9

6

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

В целом, это действительно не имеет значения. Я честно никогда не видел случая, когда быстрое перечисление против 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: вариант для перечисления одновременно.)

+0

+1 - хотя я не использовал решение, это тоже хороший совет. – DenverCoder9

Смежные вопросы