Objective-C Language
Enums
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).