La primera pregunta es qué alcance desea que tengan sus constantes, que en realidad son dos preguntas:
- ¿Estas constantes son específicas de una sola clase, o tiene sentido tenerlas en toda la aplicación?
- Si son específicos de la clase, ¿son para uso de los clientes de la clase o solo dentro de la clase?
Si son específicos e internos de una sola clase, declare como static const
en la parte superior del archivo .m, así:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Si pertenecen a una sola clase pero deben ser públicas / utilizadas por otras clases, declare como extern
en el encabezado y defínalos en el .m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Si deben ser globales, declararlos en un encabezado y definirlos en un módulo correspondiente, específicamente para esas constantes.
Puede mezclarlos y combinarlos para diferentes constantes con diferentes niveles de cuán global desea que sean, y para diferentes constantes globales que simplemente no pertenecen juntas; puede colocarlas en módulos separados, cada uno con su propio encabezado, si querer.
¿Por qué no #define
?
La vieja respuesta es "las macros no tienen información de tipo", pero los compiladores de hoy en día son bastante inteligentes al hacer toda la verificación de tipo para los literales (a qué se expanden las macros) y las variables.
La respuesta moderna es porque el depurador no sabrá sobre sus macros. No se puede decir [myThing addObserver:self forKey:MyThingNotificationKey]
en un comando de depurador si MyThingNotificationKey
es una macro; el depurador solo puede saberlo si es una variable.
¿Por qué no enum
?
Bueno, rmaddy me ganó en los comentarios: enum
solo puede definir constantes enteras. Cosas como números de identificación de serie, máscaras de bits, códigos de cuatro bytes, etc.
Para esos fines, enum
es genial y absolutamente deberías usarlo. (Aún mejor, use las macros NS_ENUM
yNS_OPTIONS
.) Para otras cosas, debe usar otra cosa; enum
no hace nada más que enteros.
Y otras preguntas
Estaba pensando en importar el archivo en el archivo Reddit-Prefix.pch para que las constantes estén disponibles para todos los archivos. ¿Es una buena forma de hacer las cosas?
Probablemente inofensivo, pero probablemente excesivo. Importe sus encabezados constantes donde los necesite.
¿Cuáles son los casos de uso para cada una de esas soluciones?
#define
: Bastante limitado. Honestamente, no estoy seguro de que haya una buena razón para usar esto para las constantes.
const
: Lo mejor para las constantes locales. Además, debe usar esto para uno que declaró en un encabezado y que ahora está definiendo.
static const
: Mejor para constantes específicas de archivo (o específicas de clase).
extern const
: Debe usar esto al exportar una constante en un encabezado.
Además, si lo uso extern const
, ¿necesito importar el archivo, o las constantes estarán disponibles globalmente sin importar el archivo?
Debe importar el archivo, ya sea en cada archivo donde lo usa o en el encabezado del prefijo.