检查是否存在C枚举

时间:2010-06-21 23:56:32

标签: iphone objective-c regex enums nsstring

在使用之前,我如何检查 NSRegularExpressionSearch 是否存在?

enum {
  NSCaseInsensitiveSearch = 1,
  NSLiteralSearch = 2,
  NSBackwardsSearch = 4,
  NSAnchoredSearch = 8,
  NSNumericSearch = 64,
  NSDiacriticInsensitiveSearch = 128,
  NSWidthInsensitiveSearch = 256,
  NSForcedOrderingSearch = 512,
  NSRegularExpressionSearch = 1024
};

更新 - 我想针对最新的SDK进行编译,并在运行时检查NSRegularExpressionSearch是否存在。

2 个答案:

答案 0 :(得分:2)

NSRegularExpressionSearch仅在

时编译
#if __IPHONE_3_2 <= __IPHONE_OS_VERSION_MAX_ALLOWED

因此,您需要检查当前的操作系统是否为3.2或更高版本。

if ( [[[UIDevice currentDevice] systemVersion] doubleValue] >= 3.2 ) {}

在其他情况下,您可能会检查某个类是否存在,或者某个实例是否响应了一个选择器,但NSString除了该枚举之外没有更改。例如,如果存在与手势识别器关联的枚举,则可以使用以下之一:

if ( NSClassFromString( @"UIGestureRecognizer" ) != nil ) {}
if ( [someView respondsToSelector:@selector(gestureRecognizers)] ) {}

再举一个例子,看看Apple如何处理UI_USER_INTERFACE_IDIOM宏。

编辑:

除系统版本外,要检查的版本号为NSFoundationVersionNumber

if ( NSFoundationVersionNumber > NSFoundationVersionNumber_iPhoneOS_3_1 ) {}

这与NSString关系更紧密,但3.2标头中没有3.2的常量。

答案 1 :(得分:1)

问题标题不正确。您的问题不是NSRegularExpressionSearch是否存在。 (是的,它在编译时存在,SDK&gt; = 3.2。)您的问题是rangeOfString:options:之类的方法是否可以在运行时正确解释正则表达式的选项位。

由于这是一个纯粹关于函数行为的问题,一个明显的解决方法是进行实验。当你的支持存在时,做一些你知道会成功的事情,但是当支持不存在时,它会失败。

我们可以使用匹配字符串的正则表达式来尝试匹配,但是正则字符串在字符串中并不存在,因此如果它不理解正则表达式选项,它将执行文字匹配并失败。例如,

if ([@"b" rangeOfString:@"." options:NSRegularExpressionSearch].location != NSNotFound) {
    // NSRegularExpressionSearch supported
}