我是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的Sublcasses(每个都有一个包含属性的单例实例)对于这样一个简单的任务和完全的过度杀戮似乎很多工作.
我目前的方法是使用NSArray创建一个包含不同实例的类.首次访问类似+(id)messageTypeForId:NSInteger id_
NSArray 的方法是预先填充的.但这感觉完全笨拙而且根本不优雅......
有更令人满意的方法吗?
"更令人满意的方法"并没有太多的方法.
正常的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 )
根据你的观点,这可能是"更令人满意"或更丑陋.