最初の質問は、定数にどのようなスコープを持たせたいかということです。これは実際には 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
およびNS_OPTIONS
マクロを使用することです。) 他のものについては、別のものを使用する必要があります。enum
整数以外は何もしません。
その他の質問
Reddit-Prefix.pch ファイルにファイルをインポートして、すべてのファイルで定数を使用できるようにすることを考えていました。それは物事を行う良い方法ですか?
おそらく無害ですが、おそらく過剰です。定数ヘッダーを必要な場所にインポートします。
これらの各ソリューションのユース ケースは何ですか?
#define
:かなり限定的です。正直なところ、これを定数に使用する正当な理由があるかどうかはわかりません。
const
: ローカル定数に最適です。また、ヘッダーで宣言し、現在定義しているものに対してこれを使用する必要があります。
static const
: ファイル固有 (またはクラス固有) の定数に最適です。
extern const
: ヘッダーで定数をエクスポートする場合は、これを使用する必要があります。
また、を使用している場合extern const
、ファイルをインポートする必要がありますか?そうしないと、ファイルをインポートしなくても定数がグローバルに使用可能になりますか?
ファイルを使用する各ファイルまたはプレフィックスヘッダーで、ファイルをインポートする必要があります。