使用C预处理器生成@property实现(在预处理器中大写一个字符)

ite*_*ter 4 objective-c c-preprocessor

我可能试图滥用预处理器.我想知道我的想法是否可能.

我的班级@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);
Run Code Online (Sandbox Code Playgroud)

我的想法是,不是使用字符串文字(或字符串常量)作为字典中的键,而是从选择器名称派生字符串.这样我确信密钥的拼写与属性名称匹配,并且基本上获得了字典密钥的编译时验证的好处.

我想要做的就是说出类似的内容SELECTOR_PROPERY(accelerometerSensitivity)并让它扩展到getter和setter中.我作为预处理器宏实现它的主要困难是从属性名称生成setter名称.我需要将属性名称的第一个字母大写,并且我不知道如何在预处理器中执行此操作.

Mar*_*iot 5

不,你不能这样做.

但是,您可以组合标识符,因此理论上您可以将其定义为:

MACRO(A,a,ccelerometerSensitivity)
Run Code Online (Sandbox Code Playgroud)

它有点像klugey,但它比替代品更简洁.