【问题标题】:Check if a C enum exists检查是否存在 C 枚举
【发布时间】:2010-06-21 23:56:32
【问题描述】:

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

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

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

【问题讨论】:

  • 没有定义帮助程序无法编译的事实吗?
  • 不是 :) 应用程序需要与不包含 NSRegularExpressionSearch 的以前版本的操作系统兼容。
  • @christo16:嗯,这没有任何意义。名称已定义(并且可以编译)或名称未定义(并且无法编译)。
  • @S.Lott 我认为他想针对当前的 SDK 进行编译,并在运行时确定他使用的 iPhone OS 版本是否支持正则表达式比较。
  • @JeremyP:有趣的猜测。 christo16 可以想要。我看不出如何以任何方式无法正确编译并且仍然以某种方式在运行时检查某些内容。我希望对问题进行更正,以准确解释应该发生的事情。

标签: iphone objective-c regex enums nsstring


【解决方案1】:

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 的常量。

【讨论】:

  • 我试图避免按操作系统版本进行检查,因为这通常是一种不好的做法。但这似乎是唯一的检查方法。
【解决方案2】:

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

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

我们可以尝试使用匹配字符串的正则表达式进行匹配,但是如果正则表达式字符串实际上并不存在于字符串中,那么如果它不理解正则表达式选项,它将进行文字匹配并失败。例如,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多