Objective c 是否有方法获取给定项目的类前缀(在运行时)?

Objective c 是否有方法获取给定项目的类前缀(在运行时)?,objective-c,reflection,naming-conventions,objective-c-runtime,Objective C,Reflection,Naming Conventions,Objective C Runtime,我想构造一个方法,该方法以字符串形式返回它所操作的模块的类前缀 例如,如果我有一个项目,其类名为XYZMessage,XYZBusiness,XYZTransaction。。。我需要一个函数来返回字符串XYZ 我有一个实现,它使用appDelegate的名称(除最后一个以外的第一个大写字母)来实现这一点,但我希望有更好的方法。我希望Xcode用这个值定义一个宏,或者plist中有一个键或者更具体的东西。我不想定义CLASS_前缀@“XYZ”或任何硬编码的东西 编辑:为什么 情况是,我有一个服务器

我想构造一个方法,该方法以字符串形式返回它所操作的模块的类前缀

例如,如果我有一个项目,其类名为
XYZMessage
XYZBusiness
XYZTransaction
。。。我需要一个函数来返回字符串
XYZ

我有一个实现,它使用appDelegate的名称(除最后一个以外的第一个大写字母)来实现这一点,但我希望有更好的方法。我希望Xcode用这个值定义一个宏,或者plist中有一个键或者更具体的东西。我不想定义CLASS_前缀@“XYZ”或任何硬编码的东西

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

{
"type" : "merchant",
"data" : {
    "name" : "Super cool pizza",
    "location" : {
        "lat" : "123.000",
        "lon" : "23.0000"
    }
}
我有一个类
AXQMerchant
,它将把这个(数据)负载作为初始值设定项(解包键/值,将类型与其属性匹配,生成子对象等)

我试图避免的是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;
str=NSStringFromClass([[UIApplication sharedApplication].delegate class])//可以是[自我类],而不是。。。
对于(整数i=0;i'Z'){//如果c不是大写字母,我们在前缀末尾(+1额外)
返回[str substringWithRange:NSMakeRange(0,i-1)];
}
}
返回零;

这是
dispatch\u once()
'd,因此我只在第一次打开应用程序时计算它。

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

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

项目的类前缀通过替换字符串
\uuuuuuuuuuuuuu变量\u classPrefix:identifier\uuuuuuuuuuuu
,因此一种可能是创建自定义.pch或头文件模板。然后,标头可以将前缀公开为宏或
NSString

如果项目中有多个具有不同前缀的类,您希望看到什么样的行为?(比如,XYZMessage、XYZBusiness、XYZTransaction、AAAPerson、AAAClass、AAAContact。)我认为“类前缀”不是一个定义得足够好的概念。类前缀是完全任意的。您对使用这些信息有什么兴趣?
是类:
通常就足够了。你到底想做什么?@CrimsonChris查看编辑部分。基本上,我想完全删除这些检查(这些类型共享一个构建它们的通用协议),这是一个有趣的难题,但我赞成预处理器定义。将其放在项目设置中。@ITAFERBER在Xcode中创建新项目时,可以选择放在泛型类前缀中;这是我想要得到的值(其他前缀并不重要)。这要求您知道前缀的长度。它不一定总是3个字符长。+1。这正是Ryan想要的(根据他的评论)。