【问题标题】:Is there a way to get the class prefix (at runtime) of a given project?有没有办法获取给定项目的类前缀(在运行时)?
【发布时间】:2014-08-19 20:25:53
【问题描述】:

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

例如,如果我的项目具有名为 XYZMessageXYZBusinessXYZTransaction... 的类,我想要一个函数来返回字符串 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


【解决方案1】:

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

【讨论】:

  • +1。这正是 Ryan 正在寻找的东西(根据他的 cmets)。
【解决方案2】:

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

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

【讨论】:

  • 这需要你知道前缀有多长。它可能并不总是 3 个字符长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2013-08-31
  • 2011-05-19
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多