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

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

Ответы [ 5 ]

15 голосов
/ 28 декабря 2010

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

id lastEl = [myArray lastObject];

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

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

2 голосов
/ 28 декабря 2010

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

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

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

NSEnumerator *enumerator = [objectSet objectEnumerator];
id setObject;
while ((setObject = [enumerator nextObject]) != nil)
{
    ...
}
1 голос
/ 30 декабря 2014

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

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

0 голосов
/ 25 апреля 2016

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

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

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

0 голосов
/ 28 декабря 2010

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

...