Die erste Frage ist, welchen Umfang Ihre Konstanten haben sollen. Das sind eigentlich zwei Fragen:
- Sind diese Konstanten für eine einzelne Klasse spezifisch oder ist es sinnvoll, sie in der gesamten Anwendung zu haben?
- Wenn sie klassenspezifisch sind, können sie von Clients der Klasse oder nur innerhalb der Klasse verwendet werden?
Wenn sie spezifisch und intern für eine einzelne Klasse sind, deklarieren Sie sie wie static const
oben in der .m-Datei wie folgt:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Wenn sie sich auf eine einzelne Klasse beziehen, aber öffentlich sein / von anderen Klassen verwendet werden sollen, deklarieren Sie sie wie extern
im Header und definieren Sie sie in der .m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Wenn sie global sein sollen, deklarieren Sie sie in einem Header und definieren Sie sie in einem entsprechenden Modul, speziell für diese Konstanten.
Sie können diese für verschiedene Konstanten mit unterschiedlichen Ebenen, wie global sie sein sollen, und für verschiedene globale Konstanten, die einfach nicht zusammengehören, mischen und abgleichen. Wenn Sie möchten, können Sie sie in separate Module mit jeweils einem eigenen Header einfügen wollen.
Warum nicht #define
?
Die alte Antwort lautet: "Makros haben keine Typinformationen", aber Compiler sind heutzutage ziemlich schlau darin, alle Typprüfungen auf Literale (auf die Makros erweitert werden) und Variablen durchzuführen.
Die moderne Antwort ist, dass der Debugger nichts über Ihre Makros weiß. Sie können [myThing addObserver:self forKey:MyThingNotificationKey]
in einem Debugger-Befehl nicht sagen, ob MyThingNotificationKey
es sich um ein Makro handelt. Der Debugger kann nur wissen, ob es sich um eine Variable handelt.
Warum nicht enum
?
Nun, rmaddy hat mich in den Kommentaren geschlagen: enum
Kann nur ganzzahlige Konstanten definieren. Dinge wie Seriennummern, Bitmasken, Vier-Byte-Codes usw.
Für diese Zwecke enum
ist großartig und Sie sollten es unbedingt verwenden. (Noch besser ist , verwenden Sie die NS_ENUM
und NS_OPTIONS
Makros .) Für andere Dinge, Sie müssen etwas anderes nutzen; enum
macht nichts anderes als ganze Zahlen.
Und andere Fragen
Ich habe darüber nachgedacht, die Datei in die Datei Reddit-Prefix.pch zu importieren, um die Konstanten für alle Dateien verfügbar zu machen. Ist es eine gute Art, Dinge zu tun?
Wahrscheinlich harmlos, aber wahrscheinlich übertrieben. Importieren Sie Ihre Konstanten-Header dort, wo Sie sie benötigen.
Was sind die Anwendungsfälle für jede dieser Lösungen?
#define
: Ziemlich begrenzt. Ich bin mir ehrlich gesagt nicht sicher, ob es einen guten Grund mehr gibt, dies für Konstanten zu verwenden.
const
: Am besten für lokale Konstanten. Außerdem müssen Sie dies für eine verwenden, die Sie in einem Header deklariert haben und jetzt definieren.
static const
: Am besten für dateispezifische (oder klassenspezifische) Konstanten.
extern const
: Sie müssen dies verwenden, wenn Sie eine Konstante in einen Header exportieren.
extern const
Muss ich bei Verwendung die Datei importieren, sonst sind die Konstanten global verfügbar, ohne die Datei zu importieren?
Sie müssen die Datei entweder in jede Datei, in der Sie sie verwenden, oder in den Präfix-Header importieren.