Поиск…


Синтаксис

  • typedef NS_ENUM (type, name) {...} - type - тип перечисления, а name - имя перечисления. значения находятся в «...». Это создает базовое перечисление и тип, чтобы идти с ним; такие программы, как Xcode, будут принимать переменную с типом перечисления, имеет одно из значений перечисления

Определение перечисления

Перечисления определяются следующим синтаксисом выше.

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 .

Объявление typedef enum в Objective-C

Перечисление объявляет набор упорядоченных значений - typedef просто добавляет к нему удобное имя. Первый элемент равен 0 и т. Д.

 typedef enum {
        Monday=1,
        Tuesday,
        Wednesday

    } WORKDAYS;

    WORKDAYS today = Monday;//value 1

Преобразование C ++ std :: vector в массив Objective-C

Многие библиотеки C ++ используют перечисления и возвращают / получают данные с использованием векторов, которые содержат перечисления. Поскольку C перечисления не являются объектами Objective-C, коллекции Objective-C нельзя использовать напрямую с C перечислениями. В приведенном ниже примере рассматривается это с помощью комбинации NSArray и generics и объекта-оболочки для массива. Таким образом, сбор может быть явным в отношении типа данных, и нет никакого беспокойства о возможных утечках памяти с массивами 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 может использоваться в файлах Objective-C только в том случае, если не используется 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