Szukaj…


Składnia

  • typedef NS_ENUM (typ, nazwa) {...} - typ to typ wyliczenia, a nazwa to nazwa wyliczenia. wartości są w „...”. Tworzy to podstawowe wyliczenie i typ do niego dołączony; programy takie jak Xcode przyjmą, że zmienna o typie wyliczania ma jedną z wartości wyliczania

Definiowanie wyliczenia

Wyliczenia są zdefiniowane przez następującą składnię powyżej.

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

Możesz także ustawić własne wartości surowe dla typów wyliczeń.

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

Możesz również określić pierwszą wartość, a wszystkie następujące wartości będą jej używać z przyrostem:

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

Zmienne tego wyliczenia mogą być tworzone przez MyEnum enumVar = MyEnumValueA .

deklaracja typedef enum w Celu C

Wyliczenie deklaruje zestaw uporządkowanych wartości - typedef po prostu dodaje do tego poręczną nazwę. Pierwszy element to 0 itd.

 typedef enum {
        Monday=1,
        Tuesday,
        Wednesday

    } WORKDAYS;

    WORKDAYS today = Monday;//value 1

Konwersja C ++ std :: vector do tablicy Objective-C

Wiele bibliotek C ++ wykorzystuje wyliczenia i zwraca / odbiera dane za pomocą wektorów zawierających wyliczenia. Ponieważ wyliczenia C nie są obiektami Objective-C, kolekcji Objective-C nie można używać bezpośrednio z Cums. Poniższy przykład zajmuje się tym przez użycie kombinacji NSArray i generics oraz obiektu otoki dla tablicy. W ten sposób kolekcja może wyrażać się jawnie na temat typu danych i nie ma obaw o możliwe wycieki pamięci z tablicami C. Wykorzystywane są obiekty Objective-C.

Oto obiekt C enum i Object-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

A oto możliwe użycie go w Objective-C ++ (wynikowy NSArray może być używany w plikach Objective-C, ponieważ nie używa się 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;
}

Jeśli tego rodzaju rozwiązanie ma być stosowane na wielu wyliczeniach, tworzenie EnumObj (deklaracja i implementacja) można wykonać za pomocą makra (w celu utworzenia szablonu podobnego do rozwiązania).



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow