objC extension + C++ define
#define PROPERTY(name) -(id)name #define GETTER(name) -(id)name { return [self objectForKey:@#name]; } #define SETTER(name) -(id)name:(id)v { return [self setObject:v forKey:@#name]; } #define GETSET(name) GETTER(name); SETTER(name) @interface NSMutableDictionary (NSMutableDictionary_getter) PROPERTY(hello); @end @implementation NSMutableDictionary (NSMutableDictionary_getter) GETSET(hello); @end id d = [[NSMutableDictionary alloc] init]; [d hello:@"world"]; // [d setObject:@"world" forKey:@"hello" ]; [d hello]; // [d objectFor:@"hello"]
って書けてjsのオブジェクトチックになるけど宣言めんどい。defineの可変長引数で全部プロパティ書くとかかなームリ。
Cのプリプロセッシングをインラインで書けたらいいのにな
d.hello にしたかったけどそれだとリテラルの先頭を大文字にする処理が必要なのと、##だと引数の前側には連結できない? のでだめでした。マクロはパズルっぽくて楽しいところがよくない。