声明带有条件的常量字符串

时间:2012-08-28 16:17:36

标签: objective-c ios

我有一个源文件来放置我的所有常量(constant.h),如下所示:

#define MY_URL @"url"
#define SECOND_URL @"url2"
...

我的问题是用这样的条件来定义常数:

if (ipad)
   #define MY_CONSTANT @"ipad"
else
   #define MY_CONSTANT @"iphone"

我怎么能这样做并把它放在constant.h

2 个答案:

答案 0 :(得分:6)

如果你同时支持ipad和iphone,那么在运行时之前你不会知道该设备。

如果使用常量标题,则可以按如下方式处理设备特定的定义:

constants.h

NSString * MON_CONSTANT();

constants.m

NSString * MON_CONSTANT() {
  switch (UI_USER_INTERFACE_IDIOM()) {
    case UIUserInterfaceIdiomPhone :
      return @"iphone";
    case UIUserInterfaceIdiomPad :
      return @"ipad";
    default :
      return @"omg";
  }
}

注意:

  • 我建议将常量放在除常量标题之外的其他位置。通常有一个位置(例如类)与常数更紧密相关。
  • 不使用#define作为常量,而是使用extern NSString* const方法。

答案 1 :(得分:5)

#define MY_CONSTANT ( ipad ? @"ipad" : @"iphone" )

#define MY_CONSTANT ( (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? @"ipad" : @"iphone" )

编辑:以上内容适用于通用应用,其中决策是实时做出的。如果你想要编译时决定,那么我通常在IPAD或IPHONE的Xcode目标中使用预处理器宏,甚至是UNIVERSAL(构建3种方式):

#if defined(IPHONE)
#define MY_CONSTANT 4
#elif defined(IPAD)
#define MY_CONSTANT 6
#elif defined (UNIVERSALO)
#define MY_CONSTANT ( ipad ? 6 : 4 )
#endif

我觉得写作既乏味又乏味:

(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

所以我创建全局BOOL变量并在appDelegate中设置值(在初始化中),并放置一个“extern BOOL iPad”。我的pch文件中的语句。在初始化中:

ipad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? YES : NO;

我知道我知道,全局变形等等 - 是的,如果你过度使用它们,但对于这样的东西它们是完美的。