Цель C: последний объект при использовании быстрого перечисления?

Каков наилучший способ узнать, когда я достиг последнего объекта в массиве при использовании быстрого перечисления? Есть ли лучший способ, чем увеличение int и сравнение его с длиной массива?

5 ответов

Решение

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

id lastEl = [myArray lastObject];

for ( id anEl in myArray )
{
   if ( anEl == lastEl )
     .....  // do the last thing
}

Стоимость сравнения такая же, как и у счетчика, но тогда у вас нет затрат на увеличение счетчика или ошибок, которые неизменно возникают, когда вы забываете увеличить счетчик.

Как правило, быстрое перечисление означает, что вы не используете счетчик...

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html

Другая форма без счетчика...

NSEnumerator *enumerator = [objectSet objectEnumerator];
id setObject;
while ((setObject = [enumerator nextObject]) != nil)
{
    ...
}

Если тест производительности здесь отвечает, то нет большой разницы в производительности между быстрым перечислением и перечислением блоков. Или bbum сказал здесь: "Перечисление на основе блоков позволяет классу коллекции перечислять содержимое так же быстро, как и самый быстрый обход собственного формата хранения".

Затем я предлагаю использовать перечисление блоков, чтобы вы одновременно получали индекс и объект, и вы могли сделать сравнение.

Вы также можете использовать перечисление с блоками:

[myArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    BOOL isLastObject = idx == [myArray count]-1;
    if (isLastObject){
        //...
    }
}];

Если вы знаете, какие объекты содержит ваш массив, лучше заменить id с соответствующим классом.

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

Тем не менее, вы все равно выиграете от того факта, что вы не можете выходить за пределы при использовании быстрого перечислителя и т. Д.

Другие вопросы по тегам