Objective-C — быстрое перечисление в подмножестве массива?

#iphone #objective-c #ios #collections #nsarray

#iPhone #objective-c #iOS #Коллекции #nsarray

Вопрос:

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

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

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

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

Спасибо.

Ответ №1:

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

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

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

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

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

Комментарии:

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

Ответ №2:

Это приходит мне на ум:

 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
}
  

Комментарии:

1. То, что быстрее, должно определяться профилированием. subArrayWithRange: Метод может быть быстрее.

2. Вы имеете в виду ‘i < arrayCount’ 🙂