Javaの列挙型をエミュレートするには、フィールドを持つことができる、同等のもの(オペランドは==
など)を必要とし、軽量です。これは、構造体、およびオプションで構造体へのポインタを示唆しています。ここで、後者の例である:
FXLayerType.h:
typedef const struct { int persistence; } FXLayerType;
extern FXLayerType * const LayerTypeExplosion;
extern FXLayerType * const LayerTypeFirework;
extern FXLayerType * const LayerTypeDust;
FXLayerType。M:OBJの-Cのオブジェクトと同様に、我々は常にこれらの構造体へのポインタを使用しながら、
#import "FXLayerType.h"
const FXLayerType _LayerTypeExplosion = { 3 };
const FXLayerType _LayerTypeFirework = { 6 };
const FXLayerType _LayerTypeDust = { 3 };
FXLayerType * const LayerTypeExplosion = &_LayerTypeExplosion;
FXLayerType * const LayerTypeFirework = &_LayerTypeFirework;
FXLayerType * const LayerTypeDust = &_LayerTypeDust;
のでFXLayerType
自体は、一定の構造体です。実装は3つの定数構造体と3つの定数ポインタを作成します。私たちは、今のようなコードを書くことができます
:
FXLayerType *a, *b;
a = LayerTypeDust;
b = LayerTypeExplosion;
NSLog(@"%d, %d\n", a == b, a->persistence == b->persistence);
どちらが出力されます "0、1" - a
とb
が異なる列挙型(0)されているが、同じ永続性を持っている(1)。ここではa
とb
は定数ポインタではなく、列挙型の "リテラル"だけが定数として定義されています。
このように書かれているように、switch
をenum値にできないという欠点があります。しかし、それが必要な場合は、たとえばtag
という2番目のフィールドを追加し、実際の列挙型を使用して一意の値、たとえばFXLayerStyleTag
を初期化するだけです。また、タグを常に比較したい場合は、間接指定を削除することもできます(例:a.tag ==
b.tag`)。これは、あなたが得られます。
FXLayerType.hを:
typedef enum { ExplosionTag, FireworkTag, DustTag } FXLayerTypeTag;
typedef struct { FXLayerTypeTag tag; int persistence; } FXLayerType;
extern const FXLayerType LayerTypeExplosion;
extern const FXLayerType LayerTypeFirework;
extern const FXLayerType LayerTypeDust;
FXLayerType.m:
#import "FXLayerType.h"
const FXLayerType LayerTypeExplosion = { ExplosionTag, 3 };
const FXLayerType LayerTypeFirework = { FireworkTag, 6 };
const FXLayerType LayerTypeDust = { DustTag, 3 };
用途:
FXLayerType a, b;
a = LayerTypeDust;
b = LayerTypeExplosion;
NSLog(@"%d, %d\n", a.tag == b.tag, a.persistence == b.persistence);
2つの設計の違い最初は周りに通過しますポインタは第2の構造体を持ち、それは大きくてもよい。それらを組み合わせて、switch
のポインタベースの列挙型を得ることができます。これは演習として残されています!
これらの設計の両方とも、列挙型「リテラル」の数をいつでも拡張できるという利点があります。
int値をenum値として使用しても問題ありません([この回答](http://stackoverflow.com/questions/5785965/is-the-following-syntax-is-correct-for-anを参照) -enum)カスタムenum値の例は?) – perelman
@perelman:うーん、私はその機能を知らなかった。それは間違いなく可能ですが、ちょっとハッキリしています。 –
@perelman:複数のレイヤータイプが同じパーシスタンス値を共有している可能性があるため、ユニークなままでなければならないので、2番目の考えでは、いいえ、できません。 –