2010-05-31 27 views

Respuesta

16

Para constantes "públicos", se declara como extern en el archivo de cabecera (.h) y inicializa en el archivo de aplicación (.m).

// File.h 
extern int const foo; 

continuación

// File.m 
int const foo = 42; 

considerar el uso de enum si no es sólo una, sino varias constantes de pertenencia común

+0

¿Qué sucede si necesito 'typedef NS_ENUM'? – ManuQiao

12

clases de Objective C no soportan constantes como miembros. No puedes crear una constante de la forma que quieras.

La forma más cercana a declarar una constante asociada con una clase es definir un método de clase que lo devuelve. También puede usar extern para acceder a las constantes directamente. Ambos se muestran a continuación:

// header 
extern const int MY_CONSTANT; 

@interface Foo 
{ 
} 

+(int) fooConstant; 

@end 

// implementation 

const int MY_CONSTANT = 23; 

static const int FOO_CONST = 34; 

@implementation Foo 

+(int) fooConstant 
{ 
    return FOO_CONST; // You could also return 34 directly with no static constant 
} 

@end 

Una ventaja de la versión del método de clase es que se puede ampliar para proporcionar objetos constantes con bastante facilidad. Puede usar objetos externos, tuerca que debe inicializar en un método de inicialización (a menos que sean cadenas). Por lo que a menudo verá el siguiente patrón:

// header 
@interface Foo 
{ 
} 

+(Foo*) fooConstant; 

@end 

// implementation 

@implementation Foo 

+(Foo*) fooConstant 
{ 
    static Foo* theConstant = nil; 
    if (theConstant == nil) 
    { 
     theConstant = [[Foo alloc] initWithStuff]; 
    } 
    return theConstant; 
} 

@end 
+0

Agregué otro bit que solo pensé en – JeremyP

+0

nice. Puede ser interesante especificar que el patrón que escribió se llama singleton y se usa a menudo para compartir cosas en todas las aplicaciones. Un buen ejemplo en el desarrollo de iPhone es la clase AppDelegate. – moxy

0

Una forma sencilla de constantes de tipo de valor como los enteros es usar el enum hack como dio a entender por unbeli.

// File.h 
enum { 
    SKFoo = 1, 
    SKBar = 42, 
}; 

Una ventaja de esto sobre el uso de extern es que todo se resuelve en tiempo de compilación por lo que no se necesita memoria para contener las variables.

Otro método es utilizar static const que es lo que era reemplazar el hack enum en C/C++.

// File.h 
static const int SKFoo = 1; 
static const int SKBar = 42; 

Un análisis rápido a través de las cabeceras de Apple muestra que el método de enumeración truco parece ser la forma preferida de hacer esto en Objective-C y, de hecho me parece más limpio y uso yo.

Además, si va a crear grupos de opciones que debe considerar el uso de NS_ENUM para crear un typesafe constantes.

// File.h 
typedef NS_ENUM(NSInteger, SKContants) { 
    SKFoo = 1, 
    SKBar = 42, 
}; 

Más información sobre NS_ENUM y es primo NS_OPTIONS está disponible en NSHipster.

Cuestiones relacionadas