有没有办法获得给定项目的类前缀(在运行时)?

时间:2014-08-19 20:25:54

标签: objective-c reflection naming-conventions objective-c-runtime

我想构造一个方法,它以字符串形式返回它正在运行的模块的类前缀。

例如,如果我的项目名为XYZMessageXYZBusinessXYZTransaction ...我希望函数返回字符串XYZ

我有一个实现,它使用appDelegate的名称(除了最后一个之外的第一个大写字母)来做这个,但我想要一个更好的方法。我希望Xcode定义一个具有此值的宏,或者是plist中的一个键或更具体的东西。我不想#define CLASS_PREFIX @"XYZ"或任何硬编码。

编辑:为什么
情况是我有一个服务器为我提供类型(即构建的类)以及信息。

{
"type" : "merchant",
"data" : {
    "name" : "Super cool pizza",
    "location" : {
        "lat" : "123.000",
        "lon" : "23.0000"
    }
}

我有一个类AXQMerchant,它将此(数据)有效负载作为它的初始化程序(解压缩键/值,将类型与其属性匹配,构建子对象等)< / p>

我试图避免的是我的API处理程序中的这个结构:

NSString* objectType = ...; //server provided
NSString* classToConstruct; //our local type
if ([objectType isEqualToString:@"transaction"]) {
    classToConstruct = @"AXQTransaction";
} else if ([objectType isEqualToString:@"store"]) {
    classToConstruct = @"AXQStore";
    ... //a series of else-if blocks
} else if ([objectType isEqualToString:@"merchant"]) {
    classToConstruct = @"AXQMerchant";
}
id object = [[NSClassFromString(classToConstruct) alloc] initWithPayload:...];
//now do something with object

当我的类型列表> 20种类型时,此部分很容易变得难以处理。我想写的是:

classToConstruct = [classPrefix() stringByAppendingString:[objectType capitalizedString]];
id object = [[NSClassFromString(classToConstruct) alloc] initWithPayload:...];

对于那些好奇的人;我目前的实施是......

str = NSStringFromClass([[UIApplication sharedApplication].delegate class]); //could be [self class], instead...
for (NSUInteger i = 0; i < str.length; i++) {
    unichar c = [str characterAtIndex:i];
    if (c < 'A' || c > 'Z') { //if c is not a capital we're at prefix end (+1 extra)
        return [str substringWithRange:NSMakeRange(0, i - 1)];
    }
}
return nil;

这是dispatch_once(),所以我只会在第一次打开应用时计算出来。

2 个答案:

答案 0 :(得分:1)

项目的类前缀seems to be available to an Xcode template file通过替换字符串___VARIABLE_classPrefix:identifier___,因此一种可能是创建自定义.pch或头文件模板。然后,标头可以将前缀公开为宏或NSString

答案 1 :(得分:0)

使用NSStringFromClass获取类名,然后返回字符串的前三个字符。

NSString *mystr = NSStringFromClass([instance class]);
return [mystr substringToIndex:3];