gpt4 book ai didi

objective-c - Objective-C 中的 Java 枚举样式类?

转载 作者:太空狗 更新时间:2023-10-30 03:20:42 26 4
gpt4 key购买 nike

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

如何以 Java 枚举的风格实现一些?或者更准确地说:

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

让我举一个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 中的单例模式没有用,因为我想要一个类的多个不同实例,每个实例在其属性中都有单独的值。

这样做的目标是让多个消息类型(大约 20 种)可以作为属性分配给消息。我的每个消息类型都有一个(固定和预定义的)颜色、属性值(在 XML 表示中)和一个数字 ID。

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

创建 20 个 MessageType 的子类(每个子类都有一个包含属性的单例实例)对于这样一个简单的任务来说似乎需要做很多工作,而且完全矫枉过正。

我目前的方法是创建一个类,其中包含一个包含不同实例的 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 中,或者按照您的操作预先计算它们,这些都是同样有效的方法。

请注意,上面的"template"方法可以通过宏生成,这样您就可以在 .m 文件中写入:

CREATEMESSAGETYPE( Default, @"white", @"standard", 1 )
CREATEMESSAGETYPE( Express, @"red", @"expressMessage", 2 )
CREATEMESSAGETYPE( Broadcast, @"green", @"broadcast", 3 )

这可能“更令人满意”或更丑陋,具体取决于您的观点。

关于objective-c - Objective-C 中的 Java 枚举样式类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/977047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com