Анонимный тип является реальным, сгенерированным компилятором типом, который создается для Вас. Хорошая вещь об этом состоит в том, что компилятор может снова использовать этот тип позже для других операций, которые требуют его, как это ПОСТЕПЕННО.
Мое понимание динамических типов - то, что они являются последними ограниченными, означая, что CLR (или ДОЛЛАР) будет оценивать объект во время выполнения и затем использовать утиный ввод, чтобы позволить или запретить членский доступ к объекту.
, Таким образом, я предполагаю, что различие - то, что анонимные типы являются истинным POCOs, который видит компилятор, но можно только использовать, и динамические типы являются последними ограниченными динамическими объектами.
Как уже писал Мувисиэль, это способ сделать это. Когда я пишу что-то подобное, я обычно сокращаю код с помощью простого макроса:
#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];
Это не сбывшаяся синтаксическая мечта, но она официально поддерживается компилятором и намного лучше, чем предыдущие решения. Дополнительные сведения см. В документации .
Насколько я знаю, это вполне допустимый способ размещения чисел с плавающей запятой в массиве NSArray.
идет по небольшой касательной, если все, что вы хотите сделать, это сохранить массив с плавающей запятой, а на самом деле не нужна дополнительная функциональность NSArray или NSNumber, тогда вам также следует рассмотреть только стандартный массив C:
float fatArray[] = {6.6, 6.9, 4.7, 6.9};
Я согласен с Моувиселем. Поскольку вы не можете помещать простые типы в массив, это способ сделать это. Выглядит немного странно и требует написания большого количества кода, но это нормально.
Если вы собираетесь создавать множество таких массивов с точно таким же количеством элементов, вы можете определить класс 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];
Если у вас есть много чисел с плавающей запятой, которые нужно преобразовать, или вы хотите вставить их из списка, разделенного запятыми, может быть проще вызвать функцию, которая конвертирует числа с плавающей запятой в экземпляр 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);
Другой вариант «ленивого» - просто использовать массив NSStrings, а затем получить тип значения, которое вы ищете, непосредственно из строки.
Примерно так:
NSArray *arrayOfNumbers = [NSArray arrayWithObjects:@"3.12",@"3.2", @"12", @"15", nil];
float number = [[arrayOfNumbers objectAtIndex:0] floatValue];