2010-06-26 14 views
18

Me pregunto si es posible agregar/agregar otro elemento a un tipo de enumeración existente (parte de un marco)?¿Es posible agregar otro elemento a un tipo de enumeración existente?

Algo como esto: Tenemos el tipo enum

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

Ahora quiero anexar o añadir a este conjunto un artículo como UIModalTransitionStyleCoverVerticalFlipped. ¿Se puede lograr algo así?

+0

Si tiene el origen del marco, puede hacer esto y cualquier otra modificación que desee. – ognian

+0

Lo que quieres hacer tiene perfecto sentido. Desafortunadamente, las enumeraciones no se pueden extender externamente de la misma manera, por ejemplo, las clases pueden ser (a través de la herencia, etc., etc.). – apollodude217

Respuesta

8

Para hacerlo, tiene que modificar la definición de tipo original para incluir el nuevo valor:

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

De lo contrario, se puede correr el riesgo de no su trabajo, y definir por separado:

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

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped = 
     UIModalTransitionStylePartialCurl + 1 
} ExtendedUIModalTransitionStyle; 

una variable que podría sostener la enumeración original se normalmente también funcionan perfectamente bien cuando/si se asigna el nuevo valor también (en un caso típico, sólo va a ser un int) - pero es no garantizado. Al menos en teoría, la implementación puede/podría asignar pocos bits suficientes para mantener esa enumeración de que agregar más valores de esta manera no funcionaría. También podría hacer la verificación de rango para asignar cualquier fuera del valor de rango no estaría permitido. Ninguno de estos es en absoluto común, por lo que desde un punto de vista práctico probablemente no sea un problema, pero desde un punto de vista teórico, nada realmente garantiza que un código como este funcione.

+0

Gracias por los dos enfoques posibles. Iré con el segundo. – user325746

+0

@Jerry approach 2 asume que Apple no va a agregar otro tipo de tipos después de UIModalTransitionStylePartialCurl en futuras versiones de SDK, de las cuales obtendrá un conflicto (s). – pnizzle

+0

@pnizzle: Sí, eso es (parte de) por qué dije específicamente: "puedes arriesgarte a que no funcione ..." –

0

Para hacer esto tiene que actualizar la declaración de enumeración para incluir UIModalTransitionStyleCoverVerticalFlipped estos valores, así

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

por lo UIModalTransitionStyleCoverVerticalFlipped será equivalente a la constante entera 4

dondequiera que utilice cualquier constante de enumeración diciembre cuerdas . el valor constante correspondiente se reemplaza por lo que se usa para restringir la variable para que solo contenga un conjunto de valores especificado (es decir, 0 a 4) en el caso mencionado anteriormente

14

Puede obligar a un elemento nuevo a tener el mismo tipo que la enumeración, pero no puedes extenderlo en una subclase. archivo de cabecera:

extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped; 

archivo de implementación:

const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10; 

asegúrese de darle un poco de espacio en caso de que el marco se extiende, por lo que no tiene conflictos. Esto es un truco, pero eliminará los errores y advertencias del compilador.

+1

plus1 para Asegúrate de dar algo de espacio – pnizzle

0

Tal vez esto le puede ayudar:

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

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

Ahora puede cambiar del subtipo conocer los valores son únicos.

Si usted no tiene acceso a BaseType, podría configurar SubTypeCase1 al último elemento de BaseType + 1.

Lo malo es, no se puede declarar un método que toma un subtipo y pasar a un BaseType sin obteniendo una advertencia de compiladorPor lo tanto, debe declarar sus métodos para tomar NSIntegers para silenciar esa advertencia.

Cuestiones relacionadas