La prima domanda è quale ambito desideri avere le tue costanti, che è in realtà due domande:
- Queste costanti sono specifiche di una singola classe o ha senso averle in tutta l'applicazione?
- Se sono specifici della classe, devono essere utilizzati dai client della classe o solo all'interno della classe?
Se sono specifici e interni a una singola classe, dichiarali static constall'inizio del file .m, in questo modo:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Se si riferiscono a una singola classe ma devono essere pubblici / utilizzati da altre classi, dichiararli come externnell'intestazione e definirli in .m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Se devono essere globali, dichiarali in un'intestazione e definiscili in un modulo corrispondente, in particolare per quelle costanti.
Puoi mescolarli e abbinarli per diverse costanti con diversi livelli di quanto vuoi che siano globali e per diverse costanti globali che semplicemente non si uniscono - puoi metterle in moduli separati, ognuno con la propria intestazione, se volere.
Perché no #define?
La vecchia risposta è "le macro non hanno informazioni sul tipo", ma i compilatori oggi sono piuttosto intelligenti nel fare tutto il controllo del tipo per i letterali (a cosa si espandono le macro) così come le variabili.
La risposta moderna è perché il debugger non sarà a conoscenza delle tue macro. Non è possibile dire [myThing addObserver:self forKey:MyThingNotificationKey]in un comando debugger se MyThingNotificationKeyè una macro; il debugger può saperlo solo se è una variabile.
Perché no enum?
Bene, rmaddy mi ha battuto nei commenti: enumpuò solo definire costanti intere. Cose come numeri identificativi seriali, maschere di bit, codici a quattro byte, ecc.
Per questi scopi, enumè fantastico e dovresti assolutamente usarlo. (Ancora meglio, usa le macro NS_ENUMeNS_OPTIONS .) Per altre cose, devi usare qualcos'altro; enumnon fa altro che numeri interi.
E altre domande
Stavo pensando di importare il file nel file Reddit-Prefix.pch per rendere le costanti disponibili per tutti i file. È un buon modo di fare le cose?
Probabilmente innocuo, ma probabilmente eccessivo. Importa le intestazioni delle costanti dove ne hai bisogno.
Quali sono i casi d'uso per ciascuna di queste soluzioni?
#define: Piuttosto limitato. Onestamente non sono sicuro che ci sia una buona ragione per usarlo più per le costanti.
const: Migliore per le costanti locali. Inoltre, devi usarlo per quello che hai dichiarato in un'intestazione e che ora stai definendo.
static const: Ideale per costanti specifiche del file (o specifiche della classe).
extern const: È necessario utilizzarlo quando si esporta una costante in un'intestazione.
Inoltre, se si utilizza extern const, è necessario importare il file o le costanti saranno disponibili a livello globale senza importare il file?
Devi importare il file, in ogni file in cui lo usi o nell'intestazione del prefisso.