Подтвердить что ты не робот

Можно добавить другой элемент в существующий тип перечисления?

Интересно, можно ли добавить/добавить другой элемент в существующий тип перечисления (часть фреймворка)?

Что-то вроде этого: у нас есть тип enum

  typedef enum {  
    UIModalTransitionStyleCoverVertical = 0,  
    UIModalTransitionStyleFlipHorizontal,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl,
 } UIModalTransitionStyle;  

Теперь я хочу добавить или добавить к этому набору элемент вроде UIModalTransitionStyleCoverVerticalFlipped. Может ли это быть выполнено?

4b9b3361

Ответ 1

Вы можете заставить новый элемент иметь тот же тип, что и перечисление, но вы не можете расширять его в подклассе. заголовочный файл:

extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped;

файл реализации:

const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10;

Убедитесь, что вы предоставили некоторое пространство в случае расширения рамки, чтобы у вас не было конфликтов. Это немного хак, но он избавится от ошибок и предупреждений компилятора.

Ответ 2

Для этого вам нужно изменить исходное определение типа, чтобы включить новое значение:

typedef enum {  
    UIModalTransitionStyleCoverVertical = 0,  
    UIModalTransitionStyleFlipHorizontal,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl,
    UIModalTransitionStyleCoverVerticalFlipped
} UIModalTransitionStyle;

В противном случае вы можете воспользоваться возможностью не работать и определять ее отдельно:

typedef enum {  
    UIModalTransitionStyleCoverVertical = 0,  
    UIModalTransitionStyleFlipHorizontal,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped =
        UIModalTransitionStylePartialCurl + 1
} ExtendedUIModalTransitionStyle;

Переменная, которая может содержать исходное перечисление, обычно также отлично работает, когда/если вы также назначаете новое значение (в типичном случае это будет только int), но это не гарантируется. По крайней мере, теоретически реализация может/может назначить несколько достаточно бит для хранения этого перечисления, что добавление большего количества значений таким образом не будет работать. Он также может выполнять проверку диапазона, поэтому присвоение любого значения вне диапазона не будет разрешено. Ни один из них вообще не распространен, поэтому с практической точки зрения это, вероятно, не проблема, но с теоретической точки зрения ничего действительно не гарантирует, что такой код будет работать.

Ответ 3

Для этого вам нужно обновить объявление Enum, чтобы включить UIModalTransitionStyleCoverVerticalFlipped эти значения, а также

typedef enum {      
 UIModalTransitionStyleCoverVertical = 0,       
 UIModalTransitionStyleFlipHorizontal,     
 UIModalTransitionStyleCrossDissolve,     
 UIModalTransitionStylePartialCurl,     
 UIModalTransitionStyleCoverVerticalFlipped 
} UIModalTransitionStyle;

поэтому UIModalTransitionStyleCoverVerticalFlipped будет эквивалентно целочисленной константе 4

если вы используете любую строковую константу из Enum dec. соответствующее постоянное значение get заменяется, поэтому оно используется для ограничения переменной только для того, чтобы удерживать только указанный набор значений (то есть от 0 до 4) в вышеупомянутом случае

Ответ 4

Возможно, это может вам помочь:

typedef NS_ENUM(NSInteger, BaseType) {
    BaseTypeCase1,
    BaseTypeCase2,
    BaseTypeSize
};

typedef NS_ENUM(NSInteger, SubType) {
    SubTypeCase1 = BaseTypeSize,
    SubTypeCase2
};

Теперь вы можете включить SubType, зная, что значения уникальны.

Если у вас нет доступа к BaseType, вы можете установить SubTypeCase1 в BaseType последний элемент + 1.

Недостатком является то, что вы не можете объявить метод, который принимает SubType и передать ему BaseType без получения предупреждения о компиляторе. Поэтому вам нужно объявить свои методы, чтобы NSIntegers заставляли замолчать это предупреждение.