Objective-CでENUMを定義して使用するにはどうすればよいですか?


180

以下に示すように、実装ファイルで列挙型を宣言し、インターフェイスでその型の変数をPlayerState thePlayerStateとして宣言しました。私のメソッドで変数を使用しました。しかし、それが宣言されていないというエラーが出ます。メソッドでPlayerState型の変数を正しく宣言して使用するにはどうすればよいですか?

.mファイル

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;

.hファイル内:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

.mファイルのいくつかのメソッドで:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

2
これで、列挙型はthePlayerStateになります。playerStateTypesは何になりますか?
user4951 2012年

3
NS_ENUMとその最新の構文については、Mattt Thompsonによる投稿NS_ENUM&NS_OPTIONSを参照してください。
バジルブルク2013年

回答:


109

あなたのtypedefヘッダファイル(またはいますいくつかの他のファイルにする必要があり#importそうでない場合、コンパイラは作るためにどのようなサイズを知ることができませんので、あなたのヘッダーにED)PlayerStateIVARを。それ以外は、私には問題ありません。


別のファイルに配置するオプションは、私の場合は適切に思えました。これが良いアプローチかどうかはわかりませんが、2つの異なるViewController(selfとdelegate / datasource)で同じ列挙型を使用する必要がありました。デリゲート/データソースのヘッダーをインポートするとエラーが発生し、単純なニーズには多すぎるようです。そのため、列挙型を宣言した新しい.hファイルを作成し、両方のviewControllers.hファイルにインポートしました。魅力のように働いた。
Leandro Alves

7
これはベストプラクティスであるため、NS_ENUMマクロの使用を推奨する必要があります
khebbie

1
NS_ENUMenumをSwiftコードで使用できるようにするには、Objective-Cでenumを宣言する必要があります。
スマイリーボー2015年

@DaveDeLong、これは2015年でも有効ですか?私はファイルでtypedef宣言しました、.mそしてそれはコンパイルしてうまく動きます。
Iulian Onofrei 2015

@IulianOnofrei他のファイルで列挙型を使用する必要がある場合は、.hファイルに入れます。1つのファイルでのみ必要な場合は、それを.mファイルに入れても問題ありません。
Dave DeLong 2015

206

Appleは、Swiftを含む、より優れたコード互換性を提供するのに役立つマクロを提供しています。マクロの使い方はこんな感じ。

typedef NS_ENUM(NSInteger, PlayerStateType) {
  PlayerStateOff,
  PlayerStatePlaying,
  PlayerStatePaused
};

ここに文書化


Obj C EnumはJavaのようにメンバー変数を持つことができますか?もしそうなら、どうですか?
時計屋2014

したがって、2番目のソリューションの方が優れていますか?
Iulian Onofrei 2014

3
2つ目の解決策は(を使用してNS_ENUM)より優れており、より近代的であり、列挙型をSwiftコードで使用できるようにする場合はObjective-Cで必要になります。
スマイリーボー、2015年

2番目のソリューションが実際に優れていることを示すために更新されました。
rebelzach、2015年

Appleの標準形式では、列挙値ごとに型名が繰り返されます。
ThomasW

29

.hで:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

1
このような回答は他のSOの質問で見つけることができますが、列挙型を確認しているときにこの質問が最初に表示されたため、ここにも回答を追加しました。
ベン・フリン

19

現在のプロジェクトでは、NS_ENUM()またはNS_OPTIONS()マクロを使用することができます。

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };

2
...さらに重要なNS_ENUMこととして、列挙型をSwiftコードで使用できるようにするには、Objective-Cで使用する列挙型を宣言する必要があります。
スマイリーボー2015年

16

これはAppleがNSStringのようなクラスに対してそれを行う方法です:

ヘッダーファイル:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

http://developer.apple.com/のコーディングガイドラインを参照してください


3
これは実際にはOPを助けません。技術的には正しいのですが、再利用可能な列挙型を作成する方法を教えていません
RyanR

24
developer.apple.comへのリンクは実際には役に立ちません。代わりに引用したい場所は他にありますか?
ブレット

すでに提供されているドキュメントをコピーして貼り付けます。メインページであるリンクは、実際には他の人の
役に立ち

3
これは、古くなって、今では、このページをご覧developer.apple.com/library/ios/releasenotes/ObjectiveC/...
アレックス・チェスター

8

NS_OPTIONSまたはNS_ENUMの使用をお勧めします。詳しくは、http//nshipster.com/ns_enum-ns_options/をご覧ください。

これはNS_OPTIONSを使用した私のコードの例です。UIViewのレイヤーにサブレイヤー(CALayer)を設定して境界線を作成するユーティリティがあります。

h。ファイル:

typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
    BSTCMBOrderNoBorder     = 0,
    BSTCMBorderTop          = 1 << 0,
    BSTCMBorderRight        = 1 << 1,
    BSTCMBorderBottom       = 1 << 2,
    BSTCMBOrderLeft         = 1 << 3
};

@interface BSTCMBorderUtility : NSObject

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color;

@end

.mファイル:

@implementation BSTCMBorderUtility

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color
{

    // Make a left border on the view
    if (border & BSTCMBOrderLeft) {

    }

    // Make a right border on the view
    if (border & BSTCMBorderRight) {

    }

    // Etc

}

@end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.