Подтвердить что ты не робот

Инициализировать NSArray с поплавками?

Является ли это допустимым способом инициализации NSArray с помощью объектов float?

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

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

Гэри

4b9b3361

Ответ 1

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

#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];

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

Ответ 2

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

Ответ 3

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

float fatArray[] = {6.6, 6.9, 4.7, 6.9};

Ответ 4

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

Ответ 5

Если вы собираетесь создавать множество этих массивов с точно таким же количеством элементов, вы можете определить класс 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];

Ответ 6

Если у вас есть много поплавков для конвертирования или хотите вставить их из списка, разделенного запятыми, может быть проще вызвать функцию, которая преобразует float в экземпляр 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); 

Ответ 7

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

Так же:

NSArray *arrayOfNumbers = [NSArray arrayWithObjects:@"3.12",@"3.2", @"12", @"15", nil];
float number = [[arrayOfNumbers objectAtIndex:0] floatValue];