Objective-C中的Java-enum样式类?

时间:2009-06-10 17:30:50

标签: objective-c

我是Obj-C的新手,请原谅我,如果这是一个愚蠢的问题:

如何以Javas枚举的方式实现一些?或者更确切地说:

我想要一个具有一些已知属性的类,这些属性在编译时修复并且每个实例都是唯一的。另外,我只想要一种实例类型。

让我举一个Java例子:

public enum MessageTypes {
  DEFAULT("white", "standard", 1),
  EXPRESS("red", "expressMessage", 2),
  BORADCAST("green", "broadcast", 3);

  String color; String tagName; int dbId;
  MessageTypes(String color, String tagName, int dbId) {
    // you get the idea
  }
  //some methonds like getEnumByTagName
}

你会如何在Objective-C中做这样的事情?我错过了什么吗?这是一个糟糕的模式吗?

提前致谢!

编辑:对不起,如果我没有说清楚的话。我知道,obj-c枚举不是我想要的(因为它们只比int的typedef略多)。

我想创建一组特定类的(单一的,不可变的)实例。 Apples Dev-Docs中的单例模式没有用,因为我想要一个类的多个不同实例,每个实例在其属性中都有单独的值。

这样做的目的是拥有多个可以作为属性分配给Message的消息类型(大约20个)。我的每种消息类型都有(修复和预定义)颜色,属性值(以XML表示形式)和数字ID。

在Java中,我会在代码示例中使用枚举。但是如何创建不同的MessageType并将它们与Obj-C中的属性相关联?

创建20个MessageType子窗口(每个子窗口都包含一个包含属性的单例实例)对于这样一个简单的任务和完全矫枉过正的工作似乎很多。

我目前的方法是使用NSArray创建一个包含不同实例的类。首次访问类似+(id)messageTypeForId:NSInteger id_的方法时,NSArray已预先填充。但这感觉完全笨拙而且一点也不优雅......

有更令人满意的方法吗?

4 个答案:

答案 0 :(得分:7)

没有太多“更令人满意的方法”。

正常的Cocoa模式是创建类似的方法:

+ (MessageTypes*) sharedDefaultMessageType;
+ (MessageTypes*) sharedExpressMessageType;
+ (MessageTypes*) sharedBroadcastMessageType;
etc

然后实现类似:

+ (MessageTypes*) sharedDefaultMessageType
{
   static MessageTypes* thisMessageType = nil;
   if ( !thisMessageType ) {
      thisMessageType = [[MessageTypes alloc] initWithColor:@"white" tagName:@"standard" dbId:1];
   }
   return thisMessageType;
}

或者,将共享MessageType *存储在NSMutableArray或NSMutableDictionary中或者按照您的方式预先计算它们都是同样有效的批准。

请注意,上面的“模板”方法可以通过宏生成,以便您可以在.m文件中写入:

CREATEMESSAGETYPE( Default, @"white", @"standard", 1 )
CREATEMESSAGETYPE( Express, @"red", @"expressMessage", 2 )
CREATEMESSAGETYPE( Broadcast, @"green", @"broadcast", 3 )
根据你的观点,

可能会“更令人满意”或更难看。

答案 1 :(得分:1)

我想我只是使用标准的C enum:

typedef enum { MT_WHITE, MT_RED, MT_GREEN } MessageType;

然后您就像使用任何其他数据类型一样使用它:

@interface Blah {}

-(void) setMessageType:(MessageType)newMessageType;

@end

答案 2 :(得分:0)

枚举不是C中的对象,因此也不是Objective-C中的对象。它们只是用户定义的标量,它们可以使用一组有限的命名值。您可以提供枚举类型的对象属性,我认为这些属性最接近您要查找的内容。

如果您需要使用此功能完成某些特定操作,您可能需要编辑帖子以指明它是什么。

答案 3 :(得分:0)

我或多或少地有同样的问题,但发现所有上述解决方案风格笨拙。 特别是当在对象上简单地使用C enum属性时,您将失去Java枚举的单例语义。我在使用Java枚举时发现的最大自由是枚举的实例实际上是单例子类,因此参与方法多态。比具有唯一属性的枚举更强大的是具有多态行为的枚举。

鉴于这是我所追求的关键特性,具有单独私有子类的Objective-C类集群是一种具有所需行为的方法,尽管在实现成本和复杂性方面有点过头了吗?