Какие данные содержатся в константе типа enum? Как добавить его в NSArray? - PullRequest
1 голос
/ 30 августа 2009

Какая информация хранится за такими вещами типа enum? Пример:

typedef enum {
    UIViewAnimationCurveEaseInOut,
    UIViewAnimationCurveEaseIn,
    UIViewAnimationCurveEaseOut,
    UIViewAnimationCurveLinear
} UIViewAnimationCurve;

Я не уверен, смогу ли я безопасно добавить такую ​​константу перечисления в массив. Есть идеи?

Ответы [ 4 ]

7 голосов
/ 30 августа 2009

Перечисления в Objective-C точно такие же, как и в C. Каждому элементу в вашем перечислении автоматически присваивается целочисленное значение, по умолчанию начинающееся с нуля.

Для предоставленного вами примера: UIViewAnimationCurveEaseInOut будет 0; UIViewAnimationCurveEaseIn будет равно 1 и т. Д.

При необходимости вы можете указать значение для перечисления:

typedef enum {
    UIViewAnimationCurveEaseInOut,
    UIViewAnimationCurveEaseIn = 0,
    UIViewAnimationCurveEaseOut,
    UIViewAnimationCurveLinear
} UIViewAnimationCurve;

Этот результат будет следующим: UIViewAnimationCurveEaseInOut равен 0; UIViewAnimationCurveEaseIn равен 0; UIViewAnimationCurveEaseOut равен 1; и так далее. Однако для базовых целей вам не нужно делать ничего подобного; это просто дает вам некоторую полезную информацию для игры.

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

Добавить элемент enum в NSArray так же просто, как добавить целое число. Единственное отличие состоит в том, что вы используете вместо этого идентификатор перечисления.

[myArray addObject:[NSNumber numberWithInt:UIViewAnimationCurveEaseInOut]];

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

4 голосов
/ 30 августа 2009

Перечисления обычно являются значениями типа int. Вы можете сохранить их в массиве, заключив их в NSNumber:

[myMutableArray addObject:[NSNumber numberWithInt:myAnimationCurve]];

... затем верните их так:

UIViewAnimationCurve myAnimationCurve = [[myMutableArray lastObject] intValue];
1 голос
/ 30 августа 2009

Если вы храните большую коллекцию 32-битных целых чисел, рассмотрите возможность использования соответствующего типа коллекции CF, а не типа коллекции NS. Это позволяет передавать пользовательские методы хранения, что избавляет от необходимости помещать в ячейку каждое целое число, добавленное в коллекцию.

Например, допустим, вы хотите получить массив из 32-битных целых чисел. Использование:

CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);

Последний параметр указывает массиву не сохранять / освобождать «адреса», которые вы передаете ему. Поэтому, когда вы делаете что-то вроде этого:

CFArrayAppendValue(arrayRef, 1);

Массив считает, что вы передаете указатель на объект, живущий по адресу памяти 0x1. Но поскольку вы сказали, чтобы он не вызывал retain / release для этого указателя, он обрабатывается коллекцией как стандартное int.

FWIW, для образовательной ценности стандартные NSMutableArrays имеют эквивалентные типы CF. Благодаря бесплатному мостовому соединению вы можете использовать коллекцию CF как стандартную коллекцию Foundation:

CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, kCFTypeArrayCallbacks);
NSMutableArray *array = (NSMutableArray *)arrayRef;
[array addObject:@"hi there!"];
NSLog(@"%@", [array objectAtIndex:0]); // prints "hi there!"

Вы можете применять те же приемы к словарям (с CFDictionary / CFMutableDictionary), наборам (CFSet / CFMutableSet) и т. Д.

1 голос
/ 30 августа 2009

Перечисления в Objective-C совпадают с перечислениями в ванили С. Это просто int. Если вы используете NSArray, то он ожидает указатель, и вы получите предупреждение, если попытаетесь добавить к нему int:

NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:UIViewAnimationCurveEaseInOut];

// Last line results in:
//    warning: passing argument 1 of 'addObject:' makes
//    pointer from integer without a cast
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...