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

Анонимный тип является реальным, сгенерированным компилятором типом, который создается для Вас. Хорошая вещь об этом состоит в том, что компилятор может снова использовать этот тип позже для других операций, которые требуют его, как это ПОСТЕПЕННО.

Мое понимание динамических типов - то, что они являются последними ограниченными, означая, что CLR (или ДОЛЛАР) будет оценивать объект во время выполнения и затем использовать утиный ввод, чтобы позволить или запретить членский доступ к объекту.

, Таким образом, я предполагаю, что различие - то, что анонимные типы являются истинным POCOs, который видит компилятор, но можно только использовать, и динамические типы являются последними ограниченными динамическими объектами.

18
задан fuzzygoat 4 October 2009 в 22:49
поделиться

7 ответов

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

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

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

32
ответ дан 21 October 2019 в 05:29
поделиться

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

4
ответ дан 21 October 2019 в 05:29
поделиться

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

float fatArray[] = {6.6, 6.9, 4.7, 6.9};
3
ответ дан 21 October 2019 в 05:29
поделиться

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

1
ответ дан 21 October 2019 в 05:29
поделиться

Если вы собираетесь создавать множество таких массивов с точно таким же количеством элементов, вы можете определить класс 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
ответ дан 21 October 2019 в 05:29
поделиться

Если у вас есть много чисел с плавающей запятой, которые нужно преобразовать, или вы хотите вставить их из списка, разделенного запятыми, может быть проще вызвать функцию, которая конвертирует числа с плавающей запятой в экземпляр 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
ответ дан 21 October 2019 в 05:29
поделиться

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

Примерно так:

NSArray *arrayOfNumbers = [NSArray arrayWithObjects:@"3.12",@"3.2", @"12", @"15", nil];
float number = [[arrayOfNumbers objectAtIndex:0] floatValue];
1
ответ дан 21 October 2019 в 05:29
поделиться