检查 C 枚举是否存在

发布于 2024-09-06 16:11:52 字数 434 浏览 6 评论 0原文

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

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

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

How would I check that NSRegularExpressionSearch exists before using it?

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

Update- I want to compile against the latest SDK and check at runtime if NSRegularExpressionSearch exists.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

流年已逝 2024-09-13 16:11:52

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

NSRegularExpressionSearch is only compiled when

#if __IPHONE_3_2 <= __IPHONE_OS_VERSION_MAX_ALLOWED

So you need to check that the current operating system is 3.2 or later.

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

In other cases you might check that a class exists or that an instance responds to a selector, but NSString did not change other than that enum. For example, if there was an enum associated with gesture recognizers you could use one of the following:

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

For another example, see how Apple handles the UI_USER_INTERFACE_IDIOM macro.

Edit:

A version number to check besides the system version is NSFoundationVersionNumber.

if ( NSFoundationVersionNumber > NSFoundationVersionNumber_iPhoneOS_3_1 ) {}

That is more closely tied to NSString, but there is no constant for 3.2 in the 3.2 headers.

电影里的梦 2024-09-13 16:11:52

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

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

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

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

The question title is not correct. Your question is not whether NSRegularExpressionSearch exists. (Yes, it exists at compile time with an SDK >= 3.2.) Your question is whether methods like rangeOfString:options: can correctly interpret the option bit for regular expression at runtime.

Since this is a question purely about the behavior of a function, one obvious way to figure it out is to do an experiment. Do something that you know will succeed when support is there but will fail when it isn't.

We can attempt a match using a regular expression that matches a string, but where the regex string does not literally exists in the string, so that if it doesn't understand the regex option it will do a literal match and fail. For example,

if ([@"b" rangeOfString:@"." options:NSRegularExpressionSearch].location != NSNotFound) {
    // NSRegularExpressionSearch supported
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文