Intereting Posts
Как я должен идеально создавать хорошо структурированный UITableViewDataSource? iOS 8.4 + Swift – пользовательские переходы из UINavigationController, как я могу ограничить поведение только одним переходом в стеке навигации? Права доступа IOS Facebook AVAudioSession Блокировка пароля блокирует AVAudioRecorder на iOS8 Освобождение иваров в Objective-C Изменение цвета отдельных букв в индексе индекса UITableView NSLayoutConstraint и присвоение переменной, которая является int Можно ли считывать поплавки из фреймбуфера OpenGL ES через API кеширования текстур iOS? Как удалить пильный диск UIView при использовании кварца? Получение ошибки при попытке хранения Int, arrayof pair в userDefaults Сделайте палку UIView в нижней части рамки ViewController в Swift scheduleTimerWithTimeInterval запускается только один раз, когда для параметра Repeats установлено значение YES ABAddressBook – Прочтите контакт со всех источников (Почта yahoo, Hotmail, ecc ..) в iOS Проблема с отображением UISegmentedControl после обновления до iOS 6 Неявная анимация в свойствах содержимого CALayer

Использование NSArray для сравнения типов C-типа

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

Код, который я использую, выглядит следующим образом:

-(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 с результатом [amounts objectAtIndex:i] я получаю ошибку, потому что вы не можете сравнивать id с int. Почему идентификатор задействован в этом случае? Не следует ли objectAtIndex просто возвращать объект по указанному индексу? Возможно ли вернуть объект, возвращенный в C int, а затем выполнить сравнение?

Или я должен просто отказаться от NSArray и делать это в C?

Вам не хватает вызова 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 НЕ зависимым друг от друга из-за параллелизма.

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