Objective-C では通知センターなどの通知キーとしてグローバルな文字列定数を定義して利用します。この定数を定義を簡単にする Tips について紹介します。
通常の定義は以下のようになります。
MyObject.h
extern NSString* const MyObjectDidChangeFooNotification;
extern NSString* const MyObjectDidChangeBarNotification;
extern NSString* const MyObjectDidChangeBazNotification;
MyObject.m
NSString* const MyObjectDidChangeFooNotification = @"MyObjectDidChangeFooNotification";
NSString* const MyObjectDidChangeBarNotification = @"MyObjectDidChangeBarNotification";
NSString* const MyObjectDidChangeBazNotification = @"MyObjectDidChangeBazNotification";
.h では extern 修飾子をつけて宣言し、.m で実体を定義するため、.h, .m それぞれに同じ変数名を記述する必要があり、冗長です。
また、実体として定義する値は単なる文字列ですが、通知キーにはユニークな値として定義するため、コピペしたまま同じ値にならないよう注意しなければなりません。
以下のようなマクロを利用することで簡単にグローバルな文字列を定義できます。
MyObject.h
#define Stringize(x) @#x
#undef DEFINE_GLOBAL_STRING
#ifdef MY_OBJECT_DEFINE_GLOBALS
#define DEFINE_GLOBAL_STRING(name) NSString *const name = @#name
#else
#define DEFINE_GLOBAL_STRING(name) extern NSString *const name
#endif
DEFINE_GLOBAL_STRING(MyObjectDidChangeFooNotification);
DEFINE_GLOBAL_STRING(MyObjectDidChangeBarNotification);
DEFINE_GLOBAL_STRING(MyObjectDidChangeBazNotification);
MyObject.m
#define MY_OBJECT_DEFINE_GLOBALS
#import "MyObject.h"
.h では MY_OBJECT_DEFINE_GLOBALS が定義されているときは extern 宣言とし、そうでないときは値を定義するため、.h にのみ定義を記載すれば済みます。
DEFINE_GLOBAL_STRINGマクロは定数名 nameをパラメータとして受取り、名前が nameであり、値が同じく name である NSString型文字列定数として定義しています。
以上、文字列定数を簡単に定義する Tips でした。