2009-06-10 8 views
13

Obj-Cの新機能ですので、これが愚かな質問であれば私を許してください:Objective-CのJava-enumスタイルのクラス?

Javas列挙型のスタイルでいくつかを実装するにはどうすればよいですか?より正確にするには:

コンパイル時に修正され、インスタンスごとに一意の既知のプロパティを持つクラスが必要です。また、私は1つのインスタンスの種類が欲しい。

は私が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以上のわずかなものです)。

特定のクラスの(kind-of-singleton、immutable)インスタンスを作成したいと思います。 Apples Dev-Docsのシングルトンパターンは、プロパティの個々の値を持つクラスの複数の別個のインスタンスが必要なので使いません。

これは、メッセージにプロパティとして割り当てることができる複数のメッセージタイプ(約20個)を持つことです。私のメッセージタイプはそれぞれ、(修正され定義された)色、属性値(XML表現)、数値IDを持っています。

Javaでは、私のコードサンプルのようにenumを使用します。しかし、どのようにして異なるMessageTypeを作成し、それらをObj-Cのプロパティに関連付けるのですか?

MessageTypeのサブクラス(それぞれプロパティを保持するシングルトンインスタンスを持つ)を作成することは、このような単純なタスクとトータルオーバーキルのための多くの作業のようです。

私の現在のアプローチは、異なるインスタンスを保持するNSArrayを持つクラスを作成することです。 +(id)messageTypeForId:NSInteger id_のようなメソッドへの最初のアクセスでは、NSArrayは事前計算されています。しかし、これはまったく不器用で、まったくエレガントではないと感じています。

もっと満足のいくアプローチはありますか?次に、あなただけの他のデータ型あなたと同じようにそれを使用

typedef enum { MT_WHITE, MT_RED, MT_GREEN } MessageType; 

答えて

7

「より満足のいくアプローチ」の方法はあまりありません。NSMutableArrayのかNSMutableDictionaryまたは事前計算で共有のMessageType *を格納し、また

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

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

、その後、彼らに何かを実装:

通常のココアのパターンのようなメソッドを作成することですあなたがしているようにそれらはすべて同様に有効なapprorachesです。上記の「テンプレート」メソッドを使用すると、.mファイルに書くことができますようにマクロを介して生成することができ

注:

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

に応じて、「より満足」以上の醜いであるかもしれないあなた視点。

+0

マクロは私の視点ではもっと醜いですが、私はあなたの最初の解決策が本当に好きです。それは私のアプローチよりも優れているようです(もっとココア風です)。ありがとうございました。 –

+0

私はいくつかのクラスで 'default'と' shared'が慣例によってどのように使われているのかを見ています。 – zekel

+0

あなたの最初のソリューションでは、なぜallocを呼び出す前にthisMessageTypeがnilであるかをチェックするのですか?その前の行のために常にゼロにならないでしょうか?初心者を助けるためのThx。 –

1

私はちょうど、標準Cの列挙型を使用したいと思います

@interface Blah {} 

-(void) setMessageType:(MessageType)newMessageType; 

@end 
+4

さて、インスタンスごとに一意のプロパティを取得できません。 –

0

列挙型は、Cのオブジェクトではありませんしたがって、Objective-Cではなくです。それらは、ユーザーが定義した名前付き値のセットが限られているスカラーだけです。列挙型のオブジェクトプロパティを与えることができます。これは、探しているものに最も近いと思います。

この機能を使用して具体的な処理が必要な場合は、投稿を編集してその内容を示すことができます。

0

私は多かれ少なかれ同じ質問をしましたが、上のすべての解決策は文体的に不器用です。 特に、単にオブジェクトのC enumプロパティを使用すると、Java enumのシングルトンセマンティクスが失われます。私がJava enumの使用で見つけた最大の自由は、enumのインスタンスが実際にはシングルトンのサブクラスなので、メソッドの多態性に関与するということです。ユニークな属性を持つ列挙型よりもさらに強力です。多態性を持つ列挙型です。

これは、実装コストと複雑さが一番上にあるにもかかわらず、シングルトンのプライベートサブクラスを持つObjective-Cクラスクラスターが望ましい振る舞いを持つアプローチになることを考えると、

関連する問題