web-dev-qa-db-ja.com

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

以下に示すように実装ファイルで列挙型を宣言し、インターフェイスでそのタイプの変数を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;

}
179
RexOnRoids

typedefはヘッダーファイル(またはヘッダーに#importedされた他のファイル)にある必要があります。そうしないと、コンパイラーはPlayerState ivarを作成するサイズを認識できません。それ以外は、私には大丈夫に見えます。

108
Dave DeLong

Appleは、Swiftなど、コードの互換性を向上させるマクロを提供しています。マクロの使用は次のようになります。

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

ここに記載

204
rebelzach

.h内:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;
27
Ben Flynn

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

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

NSStringなどのクラスに対してAppleが行う方法は次のとおりです。

ヘッダーファイル:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

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

16
Santhosbaala RS

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
6
Johannes