サーチ…


構文

  • typedef NS_ENUM(type、name){...} - typeは列挙型で、 nameは列挙型の名前です。値は "..."です。これは、基本的な列挙型とそれに付随する型を作成します。 Xcodeのようなプログラムでは、enum型の変数にenum値

列挙型の定義

列挙型は、上記の構文によって次のように定義されます。

typedef NS_ENUM(NSUInteger, MyEnum) {
    MyEnumValueA,
    MyEnumValueB,
    MyEnumValueC,
};

また、独自の生の値を列挙型に設定することもできます。

typedef NS_ENUM(NSUInteger, MyEnum) {
    MyEnumValueA = 0,
    MyEnumValueB = 5,
    MyEnumValueC = 10,
};

最初の値に指定することもできます。以下のすべてがインクリメントとともにそれを使用します:

typedef NS_ENUM(NSUInteger, MyEnum) {
    MyEnumValueA = 0,
    MyEnumValueB,
    MyEnumValueC,
};

この列挙型の変数は、 MyEnum enumVar = MyEnumValueAによって作成できます。

Objective-Cのtypedef enum宣言

enumは順序付けされた値のセットを宣言します。typedefはこれに便利な名前を追加するだけです。 1番目の要素は0などです。

 typedef enum {
        Monday=1,
        Tuesday,
        Wednesday

    } WORKDAYS;

    WORKDAYS today = Monday;//value 1

C ++ std :: vectorを変換する Objective-C配列への変換

多くのC ++ライブラリでは、列挙型を使用するベクトルを使用して列挙型と戻り値/受信データを使用しています。 CのenumはObjective-Cオブジェクトではないため、Objective-CコレクションはCのenumと直接使用することはできません。以下の例では、NSArrayとジェネリックスと配列のラッパーオブジェクトの組み合わせを使用してこれを扱います。このようにして、コレクションはデータ型を明示することができ、C配列のメモリリークの心配はありませんObjective-Cオブジェクトが使用されます。

以下は、C enumとObjective-Cの同等のオブジェクトです:

typedef enum 
{  
  Error0 = 0,
  Error1 = 1,
  Error2 = 2
} MyError;

@interface ErrorEnumObj : NSObject

@property (nonatomic) int intValue;

+ (instancetype) objWithEnum:(MyError) myError;
- (MyError) getEnumValue;

@end 

@implementation ErrorEnumObj

+ (instancetype) objWithEnum:(MyError) error
{
    ErrorEnumObj * obj = [ErrorEnumObj new];
    obj.intValue = (int)error;
    return obj;
}

- (MyError) getEnumValue
{
    return (MyError)self.intValue;
}

@end

Objective-C ++で使用することができます(結果のNSArrayはC ++が使用されないためObjective-Cのみのファイルで使用できます)。

class ListenerImpl : public Listener
{
public:
    ListenerImpl(Listener* listener) : _listener(listener) {}
    void onError(std::vector<MyError> errors) override
    {
        NSMutableArray<ErrorEnumObj *> * array = [NSMutableArray<ErrorEnumObj *> new]; 
        for (auto&& myError : errors)
        {
            [array addObject:[ErrorEnumObj objWithEnum:myError]];
        }
        [_listener onError:array];
    }

private:
    __weak Listener* _listener;
}

この種のソリューションを複数の列挙型で使用する場合は、(ソリューションのようなテンプレートを作成するために)マクロを使用してEnumObj(宣言と実装)の作成を行うことができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow