Перечисления хранилища в NSArray?

Я плохо знаком с 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 программистов, делают?

5
задан Vasily Kabunov 16 September 2016 в 04:58
поделиться

3 ответа

Преобразуйте их в целые числа и сохраните в NSNumbers. :)

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

В зависимости от того, что вы делаете, конечно, вы можете упростить код манипуляции, заключив это перечисление в реальный объект («MyColor»), который имеет перечисление в качестве свойства. Затем эти объекты можно было бы при желании перебрасывать в классы коллекций с некоторыми предварительными затратами и накладными расходами во время выполнения, которые вряд ли будут иметь значение с точки зрения производительности, в зависимости от того, что вы делаете.

13
ответ дан 18 December 2019 в 14:42
поделиться

Я бы сделал новый класс, определяющий перечисление, а затем создал бы экземпляр поддерживаемых цветов как

vector supportedColours

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

обратите внимание, что имя supportedColours предполагает, что этот вектор должен быть постоянным, определенным при запуске программы и никогда не изменяться. В этом случае «цвета» в векторе должны быть установлены в конструкторе и никогда не изменяться. Класс должен быть реализован как синглтон, и вы можете даже переопределить векторные операторы pushback () и т. Д., Чтобы заблокировать изменения.

Это характерно для «новой» технологии перечисления Java

, я также должен упомянуть, что я слишком новичок в Objective C, чтобы предоставить синтаксически правильный пример кода ... извините.

0
ответ дан 18 December 2019 в 14:42
поделиться

Возможно, вы ищете способ просто просмотреть все варианты? Как насчет того, чтобы просто спланировать старый нормальный массив?

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
0
ответ дан 18 December 2019 в 14:42
поделиться