Ricerca…


Sintassi

  • typedef NS_ENUM (type, name) {...} - type è il tipo di enumerazione e name è il nome dell'enum. i valori sono in "...". Questo crea un enum di base e un tipo per seguirlo; programmi come Xcode assumeranno una variabile con il tipo enum ha uno dei valori enum

Definire un enum

Enum sono definiti dal seguente la sintassi sopra.

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

È inoltre possibile impostare i propri valori non elaborati sui tipi di enumerazione.

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

Puoi anche specificare sul primo valore e tutti i seguenti lo utilizzeranno con incremento:

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

Le variabili di questa enumerazione possono essere create da MyEnum enumVar = MyEnumValueA .

dichiarazione typedef enum in Objective-C

Un enum dichiara un insieme di valori ordinati - il typedef aggiunge solo un nome utile a questo. Il primo elemento è 0 ecc.

 typedef enum {
        Monday=1,
        Tuesday,
        Wednesday

    } WORKDAYS;

    WORKDAYS today = Monday;//value 1

Conversione di C ++ std :: vector a una matrice Objective-C

Molte librerie C ++ usano enumerazioni e restituiscono / ricevono dati usando vettori che contengono enumerazioni. Poiché i C enum non sono oggetti Objective-C, le raccolte Objective-C non possono essere utilizzate direttamente con C enum. L'esempio seguente si occupa di ciò utilizzando una combinazione di un NSArray e di generici e un oggetto wrapper per l'array. In questo modo, la raccolta può essere esplicita sul tipo di dati e non vi è alcuna preoccupazione circa possibili perdite di memoria con i C array. Gli oggetti Objective-C vengono utilizzati.

Ecco l'oggetto equivalente C enum e 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

Ed ecco un possibile uso di esso in Objective-C ++ (il NSArray risultante può essere utilizzato solo nei file Objective-C poiché non viene utilizzato 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;
}

Se questo tipo di soluzione deve essere utilizzato su più enumerazioni, la creazione di EnumObj (dichiarazione e implementazione) può essere eseguita utilizzando una macro (per creare una soluzione modello simile).



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow