TOKOROM BLOG

iOSとかVimとかその他日々の雑多な技術情報

Objective-Cで最近お気に入りのマクロ4つ はてなブックマーク - Objective-Cで最近お気に入りのマクロ4つ

Permalink

マクロ

マクロの利用については賛否両論がありますが、ぼくはわりかし使います。

※2013/1/9 追記

上記のとおり独自のマクロを使うこと自体に賛否両論あります。
例えば独自のマクロを定義して利用することで、

  • 他の人がコードを見たときに分かりづらくなる
  • 思わぬ不具合が出るケースがある
  • 名前の衝突リスクがある(マクロは名前空間が使えない)

などのデメリットがあります。 特にチームや会社でのご利用の際にはよくよくご留意をお願いします。

1. [NSString stringWithFormat:] を簡単に

1
NSString* message = [NSString stringWithFormat:@"HELLO %3.1d", 333.333];

[NSString stringWithFormat:]はよく使うのだが長くて面倒…とよく思ってしまう。
ということで、

1
#define NSPRINTF(f, ...) [NSString stringWithFormat:f, __VA_ARGS__]

を定義して

1
NSString* message = NSPRINTF(@"HELLO %3.1d", 333.333);

としています。ちょっと楽!

** ※2013/1/9 追記 *

NSSPRINTFというネーミングは微妙。特にNSという冠詞を勝手に使うのがダメ。
元々のイメージはNSString+sprintfだったが再考すべし。

2. NSLocalizedString を簡単に

1
NSString* message = NSLocalizedString(@"KEY", nil);

NSLocalizedStringもよく使うのだが長いしあまり使わない引数がつきまとって面倒…とよく思ってしまう。
ということで、

1
#define LSTR(s) NSLocalizedString((s), nil)

を定義して

1
NSString* message = LSTR(@"KEY");

としています。ちょっと楽!

3. クラスメソッドの利用を簡単に

1
[LongLongLongNameClass classMethod];

自クラスのクラスメソッドを使うときにクラス名が長いとインスタンスメソッドのselfと比べて面倒だなと思ってしまう。 ということで、

1
#define ME [self class]

を定義して

1
[ME classMethod];

としています。ちょっと楽!

4. Blockのお伴の__weakなselfを簡単に

1
2
3
4
__weak MyClass* SELF = self;
[self doSomethingWithBlock:^{
  [SELF showAlert];
}];

Blockを使ってそこにselfをweakリファレンスで渡したいとき、そのコードの記述が面倒だなと思ってしまう。 ということで、

1
#define PREPARE_SELF __weak typeof(self) SELF = self

を定義して

1
2
3
4
PREPARE_SELF;
[self doSomethingWithBlock:^{
  [SELF showAlert];
}];

としています。ちょっと楽!

参考ページ

Comments