こういうのを用意しておけば
#define OBJC_STRINGIFY(x) @#x #define encodeObject(x) [aCoder encodeObject:x forKey:OBJC_STRINGIFY(x)] #define decodeObject(x) x = [aDecoder decodeObjectForKey:OBJC_STRINGIFY(x)]
これが
- (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if(self) { _obj = [aDecoder decodeObjectForKey:@"_obj"]; } return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeInt:_val forKey:@"_obj"]; }
こうなる
(id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if(self) { decodeObject(_obj); } return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { encodeObject(_obj); }
いつもコード書いてて気になってたところなので自分的にはかなりヒット。このマクロを使うメリットはキー値のタイプミスをコンパイラで拾うことができるところ。もちろんコード量も減る。(最初のケースだと一箇所間違えて @"_objj" と書いてもコンパイラはエラーは出さないし、実行時に意図通りに動かない)
仕組みは単純で # を使ってる。
Cでは #を使うとシンボルを文字列として扱うことができる。
#define STRINGIFY(x) #x int myVariable = 5; NSLog(@"%s", STRINGIFY(myVariable));と書けば、"myVariable" がログに出る。
Obj-Cの文字列への変換もできて
#define OBJC_STRINGIFY(x) @#x int myVariable = 5; NSString *foo = OBJC_STRINGIFY(myVariable); NSLog(@"%@", foo);も "myVariable" がログに出る。