我是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已预先填充。但这感觉完全笨拙而且一点也不优雅......
有更令人满意的方法吗?
答案 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类集群是一种具有所需行为的方法,尽管在实现成本和复杂性方面有点过头了吗?