【发布时间】:2011-07-20 03:59:05
【问题描述】:
我可能试图滥用预处理器。我想看看我的想法是否可行。
我的班级有@properties,它们都具有相同的主体。我想用预处理器宏生成这些主体。例如:
- (float) accelerometerSensitivity {
return [dict floatForSelector:_cmd or:1];
}
- (void) setAccelerometerSensitivity:(float) n {
[dict setFloat:n forSelector:_cmd];
[dict writeToFile:[self globalDataFilename] atomically:YES];
}
- (float) returnSpringTension {
return [dict floatForSelector:_cmd or:0];
}
- (void) setReturnSpringTension:(float) n {
[dict setFloat:n forSelector:_cmd];
[dict writeToFile:[self globalDataFilename] atomically:YES];
}
// set*ForSelector methods are in a category on NSMutableDictionary and depend on a function that translates selectors into strings:
// NSString* keyFromSelector(SEL selector);
我的想法是,我不使用字符串文字(或字符串常量)作为字典的键,而是从选择器名称中派生字符串。这样我就可以确定键的拼写与属性名称匹配,并且从本质上获得了字典键的编译时验证的好处。
我想做的是说SELECTOR_PROPERY(accelerometerSensitivity) 之类的内容,然后将其扩展为getter 和setter。我将其实现为预处理器宏的主要困难是从属性名称生成设置器名称。我需要将属性名称的第一个字母大写,但我不知道如何在预处理器中这样做。
【问题讨论】:
标签: objective-c c-preprocessor