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 consten 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 externen 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 MyThingNotificationKeyes 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, enumes genial y absolutamente deberías usarlo. (Aún mejor, use las macros NS_ENUMyNS_OPTIONS .) Para otras cosas, debe usar otra cosa; enumno 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.