54
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Objective-C でグローバルな文字列定数の定義を簡単にする

Posted at

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 でした。

54
53
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?