【发布时间】:2014-08-19 20:25:53
【问题描述】:
我想构造一个方法,它以字符串形式返回它正在运行的模块的类前缀。
例如,如果我的项目具有名为 XYZMessage、XYZBusiness、XYZTransaction... 的类,我想要一个函数来返回字符串 XYZ。
我有一个实现,它使用 appDelegate 的名称(除最后一个之外的第一个大写字母)来执行此操作,但我想要一个更好的方法。我希望 Xcode 用这个值定义一个宏,或者 plist 中有一个键或更具体的东西。我不想#define CLASS_PREFIX @"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;
这是dispatch_once()'d,所以我只在第一次打开应用程序时计算它。
【问题讨论】:
-
如果项目中有多个具有不同前缀的类,您在寻找什么样的行为? (例如,XYZMessage、XYZBusiness、XYZTransaction、AAAPerson、AAAClass、AAAContact。)我不认为“类前缀”是一个定义良好的概念。类前缀是完全任意的。您有兴趣将这些信息用于什么目的?
-
isKindOfClass:通常就足够了。你到底想做什么? -
@CrimsonChris 请参阅编辑部分。基本上我想完全删除检查(这些类型共享一个构建它们的通用协议)
-
有趣的谜题,但我投票支持预处理器定义。放入项目设置中。
-
@ItaiFerber 在 Xcode 中创建新项目时,可以选择放入通用类前缀; 那是我想得到的值(其他前缀不重要)。
标签: objective-c reflection naming-conventions objective-c-runtime