Есть ли сокращенный способ получить число с плавающей точкой из массива? - PullRequest
5 голосов
/ 23 января 2012

Я новичок в разработке iPhone для Objective C, и я обнаружил, что довольно часто делаю поплавки (и целочисленные значения) в различных NSArrays

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:integerSelector] floatValue];

Я понимаючто мне нужно сделать этот бокс, потому что float (или int) не является указателем, а NSArray принимает только указатели.

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

На языке, подобном C #, я написал бы что-то вроде

float myResult = myArray[i] + someOtherArray[i+1];

(хорошо - это, вероятно, довольно глупая строка кода - но синтаксически это довольно чисто, я думаю, потому что .net неявно выполняет упаковку, где я могуне вижу этого)

в объективе C я нахожу себя пишущим:

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:i] floatValue];
float myOtherFloatValue = [(NSNumber *)[someOtherArray objectAtIndex:i+1] floatValue];

float myResult = myFloatValue + myOtherFloatValue;

Мне просто интересно, упустил ли я здесь трюк, набрав все это от руки.Должен ли я использовать альтернативу NSArray?Есть ли ярлык для бокса / распаковки?

Или, наверное, мне просто привыкнуть и перестать ныть;)

Ответы [ 5 ]

6 голосов
/ 23 января 2012

Вы можете создать категорию:

@class NSArray (FloatHelper)

- (float) floatAtIndex:(NSUInteger)i;

@end

@implementation NSArray (FloatHelper)

 - (float) floatAtIndex:(NSUInteger)i {
   return [[self objectAtIndex:i] floatValue];
 }

@end

(Не проверено и не имеет обработки ошибок, что, очевидно, не очень хорошая идея.)

Тогда это можно использовать следующим образом:

float a = [array floatAtIndex:1];
2 голосов
/ 23 января 2012

Я не думаю, что для этого есть какое-то сокращение, кстати,

float myFloatValue = [[myArray objectAtIndex:i] floatValue];

законно.

1 голос
/ 23 января 2012

Вы можете создать категорию, функцию или макрос, чтобы сделать это с меньшим количеством подробного кода.

Но если вы делаете это в цикле, который потребляет значительное время ЦП (как определено профилированием с помощью Инструментов), вам следует рассмотреть возможность использования массива C, к которому можно получить доступ, используя гораздо меньше циклов ЦП, тем самым экономя батарею пользователя жизнь. Если вы касаетесь одних и тех же элементов несколько раз, может оказаться даже оптимальным скопировать все эти плавающие объекты из NSArray в обычный массив C-чисел перед выполнением цикла вычислений.

1 голос
/ 23 января 2012

К сожалению, Objective-C не поддерживает автобокс.

Для получения дополнительной информации, пожалуйста, посетите ссылку - Aotoboxing в цель c?

0 голосов
/ 23 января 2012

Почему бы вам не создать макрос ,

#define _floatValue(array, index) [(NSNumber *)[array objectAtIndex:index] floatValue]

использовать его ,

float myFloatValue = _floatValue(myArray, i);
float myOtherFloatValue = _floatValue(someOtherArray, i+1);
float myResult = myFloatValue + myOtherFloatValue;

и просто перестань беспокоить себя?

...