Инициализировать NSArray с помощью float? - PullRequest
18 голосов
/ 05 октября 2009

Это правильный способ инициализации NSArray с плавающими объектами?

NSArray *fatArray = [NSArray arrayWithObjects:
                    [NSNumber numberWithFloat:6.9],
                    [NSNumber numberWithFloat:4.7],
                    [NSNumber numberWithFloat:6.6],
                    [NSNumber numberWithFloat:6.9],nil];

Работает и чувствует себя хорошо, просто хотел убедиться, что я на правильном пути.

* 1006 Гэри *

Ответы [ 7 ]

32 голосов
/ 05 октября 2009

Как уже писал mouviciel, это способ сделать это. Когда я пишу что-то вроде этого, я обычно делаю код короче, используя простой макрос:

#define FBOX(x) [NSNumber numberWithFloat:x]

Затем вы можете переписать код следующим образом:

NSArray *fatArray = [NSArray arrayWithObjects:
    FBOX(6.9), FBOX(4.7), FBOX(6.6), FBOX(6.9), nil];

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

Если вы написали много такого кода, вы могли бы создать категорию с пользовательским инициализатором с переменным числом float аргументов, но тогда возникла проблема с завершением списка аргументов. Сначала вы можете передать общее количество поплавков:

- (id) initWithFloats: (int) numFloats data: (float) float1, ...;

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


Обратите внимание, что в настоящее время вы можете просто написать следующее:

NSArray *list = @[@6.9, @4.7, @6.6, @6.9];

Это не мечта синтаксиса, но она официально поддерживается компилятором и намного лучше, чем предыдущие решения. См. Документацию для большего совершенства .

4 голосов
/ 05 октября 2009

Насколько я знаю, это совершенно правильный способ размещения чисел в NSArray.

3 голосов
/ 05 октября 2009

идет по небольшому касанию, если все, что вы хотите сделать, это сохранить массив чисел с плавающей запятой и на самом деле не нуждаетесь в дополнительной функциональности NSArray или NSNumber, то вам также следует рассмотреть только стандартный массив C:

float fatArray[] = {6.6, 6.9, 4.7, 6.9};
1 голос
/ 23 ноября 2009

Другой ленивый вариант - просто использовать массив NSStrings, а затем получить искомый тип значения прямо из строки.

Вроде так:

NSArray *arrayOfNumbers = [NSArray arrayWithObjects:@"3.12",@"3.2", @"12", @"15", nil];
float number = [[arrayOfNumbers objectAtIndex:0] floatValue];
1 голос
/ 09 ноября 2009

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

NSArray*  arrayFromFloats(NSUInteger count, float *floats)
{
    NSMutableArray* ma = [NSMutableArray arrayWithCapacity:count]; 
    NSUInteger i; 
    for (i=0; i<count; i++) { 
        [ma addObject:[NSNumber numberWithFloat:floats[i]]];
    }
    return (NSArray*)ma; 
}

Пример звонящего по телефону:

static float floats[] = {1.1, 2.2, 3.3}; 
NSUInteger count = sizeof(floats)/sizeof(float);
NSArray* a = arrayFromFloats(count, floats); 
1 голос
/ 06 октября 2009

Если вы собираетесь создавать множество этих массивов с одинаковым количеством элементов, вы можете определить класс FloatArrayFactory, который реализует что-то вроде:

+ (NSArray *) arrayWithFloat: (float)f;
+ (NSArray *) arrayWithFloat: (float)f1 and: (float)f2;
+ (NSArray *) arrayWithFloat: (float)f1 and: (float)f2 and: (float)f3;
+ (NSArray *) arrayWithFloat: (float)f1 and: (float)f2 and: (float)f3 and: (float)f4;

И если это слишком многословно, вы можете пойти на краткий и забавный взгляд безымянных параметров:

+ (NSArray *) arr: (float)f1 : (float)f2 : (float)f3;

который вы можете назвать так:

NSArray *a = [Factory arr: 1.0 :2.0 :3.0 :4.0];
1 голос
/ 05 октября 2009

Я согласен с mouviciel. Поскольку вы не можете помещать простые типы в массив, это способ сделать это. Выглядит немного странно и много кода для написания, но это хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...