我是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程序员做了什么?
答案 0 :(得分:13)
将它们转换为整数并将它们存储在NSNumbers中。 :)
本地C类型实际上是Cocoa集合类中的第二类公民,如果要混合使用,它们通常很复杂。 C表示枚举具有整数值,因此以这种方式将它们用作整数是安全的。
根据您正在做的事情,您可以通过将枚举包装在以枚举作为属性的实际对象(“MyColor”)中来简化操作代码。然后可以根据需要在集合类中抛出这些对象,其中一些前期和运行时开销从执行的角度来看不太重要,具体取决于您正在做什么。
答案 1 :(得分:0)
我会创建一个新类来定义枚举,然后将支持的颜色实例化为
vector<colorEnumClass> supportedColours
注意supportColours这个名称表明这个向量应该是一个常量,在程序启动时定义,永远不会改变。如果是这种情况,则应在构造函数中设置向量中的“颜色”,并且永远不会更改。该类应该作为Singleton实现,你甚至可以覆盖pushback()等的向量运算符来阻止修改。
这属于"new" Java enumeration technology
的性质我还应该提一下,我对Objective C来说太新了,无法提供语法正确的代码示例..抱歉。
答案 2 :(得分:0)
您可能正在寻找一种方法来简单地遍历所有选项?如何只是一个计划旧的正常数组?
typedef enum {RED,BLUE,GREEN,YELLOW} color;
color colors[4]={RED,YELLOW,GREEN,BLUE};
for (int i=0;i<4;i++)
colors[i];
另一方面,如果性能不是问题,而您只是想稍微清理一下代码;如何创建一个封装NSMutableArray并创建相关方法的ColorArray类。
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