Использование NSArray для сравнения int типа C - PullRequest
1 голос
/ 15 ноября 2011

Я хотел бы перебрать NSArray из int и сравнить каждый из них с конкретным int.Все типы являются типами типа C.

Я использую следующий код:

-(int)ladderCalc: (NSArray*)amounts: (int)amount 
{
    int result;

    for (NSUInteger i=0; i< [amounts count]; i++) 
    {
        if (amount < [amounts objectAtIndex:i]);
        {
            // do something
        }
        // do something
    }
}

Однако при сравнении значения int amount с результатом [amounts objectAtIndex:i] я получаю сообщение об ошибке.потому что вы не можете сравнить id с int.Почему идентификатор участвует в этом случае?Разве objectAtIndex не должен просто возвращать объект по указанному индексу?Можно ли привести объект, возвращенный к C int, и затем выполнить сравнение?

Или я должен просто обойтись без NSArray и делать подобные вещи в C?

Ответы [ 2 ]

6 голосов
/ 15 ноября 2011

Вы пропускаете вызов intValue там (при условии, что ваш массив содержит экземпляры NSNumber, что справедливо предположить).

Также для повышения производительности вы, вероятно, захотитедля вызова [amounts count] только один раз, вот так:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{
    int result;
    NSUInteger amountCount = [amounts count];
    for (NSUInteger i = 0; i < amountCount; i++) 
    {
        if (amount < [[amounts objectAtIndex:i] intValue]);
        {
            // do something
        }
        // do something
    }
}

А вот еще быстрее благодаря (оптимизированному для системы) быстрому перечислению:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{
    int result;
    for (NSNumber *amount in amounts) {
        if (amount < [amount intValue]) {
            // do something
        }
        // do something
    }
}

И еще быстреепредыдущая, благодаря одновременному выполнению:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{
    int result;
    [amounts enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber *amount, NSUInteger idx, BOOL *stop) {
        if (amount < [amount intValue]) {
            // do something
        }
        // do something
    }];
}

Предупреждение: последняя версия требует, чтобы ваши // do something s НЕ зависели друг от друга из-за параллелизма.

2 голосов
/ 15 ноября 2011

NSArray - это массив, который содержит объекты, а не примитивные типы.Чтобы поместить целые числа C в массив, вы обычно заключаете их в экземпляры класса NSNumber.NSArray будет содержать объекты NSNumber, из которых вы можете легко получить значения примитивов, используя метод intValue, так как @Regexident демонстрирует другой опубликованный ответ.

...