2010-03-04 25 views
12

Tengo varias clases obj-c, cada una de las cuales requiere un número de constantes que se usan en las sentencias switch.Constantes de clase

He intentado definir estas constantes numéricas en el archivo .m usando la instrucción de preprocesador #define. Todas estas constantes comienzan con 'kCell'. Esto parece funcionar bien, pero el sentido del código de Xcode me presenta todas las constantes prefijadas de 'kCell', sin importar dónde esté en el proyecto. ¿Las constantes #define tienen alcance global? De ser así, ¿cuál es la mejor manera de definir constantes de clases puramente locales que no clasifiquen con constantes con nombres similares en otras clases?

Respuesta

34

tener su propio archivo de constantes como MyConstants.

En MyConstants.h declaran todas sus constantes:

static const int kRedisplayTileCount = 5 ; 
extern NSString* const kCellTitleKey; 

y en MyConstants.m ellos definen

NSString* const kCellTitleKey = @"CellTitle"; 

Al mantener constantes en archivo separado, será fácil para usted para rastrearlos y cambia su valor

Esta es la mejor manera de definir puramente constantes. Y esto evitará duplicar claves también.

único que hay que hacer es importar esta clase en otros clases:

#import "MyConstants.h" 

y utilizar estas teclas de inmediato:

obj = [[NSUserDefaults standardUserDefaults] integerForKey: kCellTitleKey]; 
+4

Error ortográfico consistente, me gusta eso (MyConstantnts). – pauloya

+4

También podría poner #import "MyConstants.h" en su archivo Prefix.pch para que esté accesible desde todos los archivos .m de su proyecto. –

+0

Pero estas no son constantes de clase. ¿Qué pasa si tengo dos archivos ClassA.h y ClassB.h y tengo una constante 'SomeErrorCode = 1' en ClassA.hy' SomeErrorCode = 2' en ClassB.h? ¿Cómo me aseguro de que en el código de llamada pueda verificar ClassA.SomeErrorCode y ClassB.SomeErrorCode y aún obtener dos valores diferentes, ya que están definidos en ambos archivos .h? – JustAMartin

5

Las constantes #define solo existen en el archivo .m.

Si las constantes son números enteros también se puede definir en un enum:

enum { 
    kCellSomething = 123, 
    kCellAnotherThing = 456, 
    ... 
}; 
1

Esto parece funcionar bien, pero el sentido de código de Xcode es presentándome con cada constante prefijada 'kCell' sin importar dónde estoy en el proyecto. ¿Las constantes #definir tienen alcance global? De ser así, ¿cuál es la mejor manera de definir constantes de clases puramente locales que no clasifiquen con constantes con nombres similares en otras clases?

La disponibilidad de Xcode Code Sense y Runtime no es idéntica. Xcode también ofrece selectorNames y otras cosas de elementos que no son visibles en el tiempo de ejecución.

Todo lo que se define en un archivo .m es local en tiempo de ejecución.

tienen también un vistazo a esta pregunta: Constants in Objective-C

8

general, me parece que las enumeraciones son los más utilizados para los conmutadores:

typedef enum { 
    kCellConstantOne = 1, 
    kCellConstantTwo = 2, //... 
} kCellConstants; 

/* later */ 
- (void)foo:(kCellConstant)constant { 
    switch (constant) { 
    case kCellConstantOne: 
     //do something 
     break; 
    case kCellConstantTwo: 
     //do something else 
     break; 
    } 
} 

Desafortunadamente xCode no limite es de sentido de código (finalización de código, auto -completo) a cualquier archivo específico. Trata de descubrir qué constantes son accesibles desde qué áreas de tu código, pero he notado que no es 100% exacto.

Sugeriría no iniciarlos todos con el mismo prefijo.Por ejemplo, si tiene dos tipos diferentes de celdas de tabla, kCustomCell y kOtherCell podrían ser mejores formas de nombrar sus constantes.