Можно добавить еще один элемент в существующий тип enum? - PullRequest
20 голосов
/ 26 июня 2010

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

Примерно так: У нас есть тип enum

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

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

Ответы [ 4 ]

16 голосов
/ 15 ноября 2014

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

extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped;

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

const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10;

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

8 голосов
/ 26 июня 2010

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

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

В противном случае вы можете рискнуть, если оно не работает, и определить его отдельно:

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

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped =
        UIModalTransitionStylePartialCurl + 1
} ExtendedUIModalTransitionStyle;

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

1 голос
/ 14 июля 2017

Может быть, это может вам помочь:

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

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

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

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

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

0 голосов
/ 04 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...