Я плохо знаком с Objective C, но испытанный в C++ и C.
Я хочу сохранить некоторые перечислимые константы в массиве. В C++ я сделал бы что-то вроде этого:
enum color {RED, BLUE, YELLOW, GREEN};
vector<color> supportedColors;
supportedColors.push_back(RED);
supportedColors.push_back(GREEN);
Но NSArray
только сохранит объектные указатели (id's
). Таким образом, как они должны быть сохранены? Я мог возможно бросить их к целым числам и сохранить их в NSNumber
объект, но это кажется грязным.
Интересно, что испытало obj-c программистов, делают?
Преобразуйте их в целые числа и сохраните в NSNumbers. :)
Нативные типы C на самом деле являются гражданами второго сорта в классах коллекций Какао, и они часто многословны для работы, если вы хотите смешаться. C говорит, что перечисления имеют целочисленные значения, поэтому можно безопасно использовать их как целые числа таким образом.
В зависимости от того, что вы делаете, конечно, вы можете упростить код манипуляции, заключив это перечисление в реальный объект («MyColor»), который имеет перечисление в качестве свойства. Затем эти объекты можно было бы при желании перебрасывать в классы коллекций с некоторыми предварительными затратами и накладными расходами во время выполнения, которые вряд ли будут иметь значение с точки зрения производительности, в зависимости от того, что вы делаете.
Я бы сделал новый класс, определяющий перечисление, а затем создал бы экземпляр поддерживаемых цветов как
vector
, после чего вы можете сделать что-то вроде: дать методам класса для тестирования цвета, чтобы увидеть, соответствует ли он член вектора ... тогда вы можете использовать этот метод в операторах IF, а не в явном тестировании с использованием операторов отношения. Более четкое кодирование: -)
обратите внимание, что имя supportedColours предполагает, что этот вектор должен быть постоянным, определенным при запуске программы и никогда не изменяться. В этом случае «цвета» в векторе должны быть установлены в конструкторе и никогда не изменяться. Класс должен быть реализован как синглтон, и вы можете даже переопределить векторные операторы pushback () и т. Д., Чтобы заблокировать изменения.
Это характерно для «новой» технологии перечисления Java
, я также должен упомянуть, что я слишком новичок в Objective C, чтобы предоставить синтаксически правильный пример кода ... извините.
Возможно, вы ищете способ просто просмотреть все варианты? Как насчет того, чтобы просто спланировать старый нормальный массив?
typedef enum {RED,BLUE,GREEN,YELLOW} color;
color colors[4]={RED,YELLOW,GREEN,BLUE};
for (int i=0;i<4;i++)
colors[i];
С другой стороны, если производительность не является проблемой, и вы просто хотите немного очистить код; как насчет создания класса ColorArray, который инкапсулирует NSMutableArray и создает соответствующие методы.
ColorArray.h:
#import <Foundation/Foundation.h>
typedef enum {RED,BLUE,GREEN,YELLOW} Color;
@interface ColorArray : NSObject {
NSMutableArray* _array;
}
- (id) initWithArray:(Color[])colors;
- (void) addColor:(Color)color;
- (Color) colorAtIndex:(int)i;
@end
ColorArray.c:
#import "ColorArray.h"
@implementation ColorArray
- (id) init {
if (self = [super init]) {
_array = [[NSMutableArray alloc] init];
}
return self;
}
- (id) initWithArray:(Color[])colors {
if (self = [super init]) {
_array = [[NSMutableArray alloc] init];
for (int i=0;colors[i]!=0;i++)
[_array addObject:[NSNumber numberWithInt:colors[i]]];
}
return self;
}
- (void) dealloc {
[_array release];
[super dealloc];
}
- (void) addColor:(Color)color {
[_array addObject:[NSNumber numberWithInt:color]];
}
- (Color) colorAtIndex:(int)i {
return [[_array objectAtIndex:i] intValue];
}
@end