代码之家  ›  专栏  ›  技术社区  ›  Mo.

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

  •  13
  • Mo.  · 技术社区  · 17 年前

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

    我如何以JavasEnum的风格实现一些?或者更准确地说:

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

    让我举一个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枚举不是我想要的(因为它们只比typedef到int稍微多一些)。

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

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

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

    创建MessageType的20个子case(每个子case都有一个保存属性的单例实例)对于这样一个简单的任务和完全的杀伤力来说似乎是一项艰巨的工作。

    我当前的方法是创建一个包含不同实例的NSArray类。在第一次访问类似 +(id)messageTypeForId:NSInteger id_

    有更令人满意的方法吗?

    4 回复  |  直到 17 年前
        1
  •  7
  •   Peter N Lewis    17 年前

    “更令人满意的方法”的途径并不多。

    通常的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 )
    

    哪一种可能“更令人满意”或更丑陋,取决于你的观点。

        2
  •  1
  •   Stephen Darlington    17 年前

    我想我应该使用标准的C枚举:

    typedef enum { MT_WHITE, MT_RED, MT_GREEN } MessageType;
    

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

    @interface Blah {}
    
    -(void) setMessageType:(MessageType)newMessageType;
    
    @end
    
        3
  •  0
  •   Chuck    17 年前

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

        4
  •  0
  •   Dave Whitla    16 年前

    考虑到这是我所追求的关键特性,一个带有单例私有子类的Objective-C类集群是否是一种具有所需行为的方法,尽管在实现成本和复杂性方面有点过高?