最初の質問は、定数にどのようなスコープを持たせたいかです。これは、実際には2つの質問です。
- これらの定数は単一のクラスに固有のものですか、それともアプリケーション全体にそれらがあるのが理にかなっていますか?
- それらがクラス固有である場合、それらはクラスのクライアントが使用するためのものですか、それともクラス内だけですか?
それらが特定であり、単一のクラスの内部にある場合はstatic const
、次のように.mファイルの先頭として宣言します。
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
それらが単一のクラスに関係するが、他のクラスによってパブリック/使用される必要がある場合は、それらをextern
ヘッダーのように宣言し、.mで定義します。
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
それらをグローバルにする必要がある場合は、それらをヘッダーで宣言し、対応するモジュールで、特にこれらの定数に対して定義します。
これらを混合して、どのようにグローバルにしたいかというさまざまなレベルのさまざまな定数と、単に一緒に属さないさまざまなグローバル定数とを一致させることができます。これらを別々のモジュールに配置し、それぞれに独自のヘッダーを付けることができます。欲しいです。
なんで#define
?
古い答えは「マクロには型情報がない」ですが、今日のコンパイラーは、変数だけでなくリテラル(マクロの展開先)のすべての型チェックを実行するのがかなり賢明です。
最近の答えは、デバッガーがマクロについて知らないためです。マクロである[myThing addObserver:self forKey:MyThingNotificationKey]
場合、デバッガーコマンドで言うことはできませんMyThingNotificationKey
。デバッガはそれが変数である場合にのみそれを知ることができます。
なんでenum
?
まあ、rmaddyはコメントで私を打ち負かしました:enum
整数定数しか定義できません。シリアルID番号、ビットマスク、4バイトコードなど。
それらの目的のために、enum
素晴らしいです、そしてあなたは絶対にそれを使うべきです。(さらに良いのは、NS_ENUM
and NS_OPTIONS
マクロを使用することです。)他のものについては、他のものを使用する必要があります。enum
整数以外は何もしません。
そして他の質問
Reddit-Prefix.pchファイルにファイルをインポートして、すべてのファイルで定数を使用できるようにすることを考えていました。それは物事を行うのに良い方法ですか?
おそらく無害ですが、おそらく過剰です。定数ヘッダーを必要な場所にインポートします。
これらの各ソリューションのユースケースは何ですか?
#define
:かなり限定されています。正直なところ、これを定数に使用する十分な理由があるかどうかはわかりません。
const
:ローカル定数に最適です。また、これをヘッダーで宣言し、現在定義しているものに使用する必要があります。
static const
:ファイル固有(またはクラス固有)の定数に最適です。
extern const
:ヘッダーで定数をエクスポートする場合は、これを使用する必要があります。
また、を使用している場合extern const
、ファイルをインポートする必要がありますか、それとも定数をファイルをインポートしなくてもグローバルに使用できますか?
ファイルは、使用する各ファイルまたはプレフィックスヘッダーにインポートする必要があります。