如何使用API​​检查定义宏?

时间:2017-12-01 10:06:55

标签: ios objective-c

我想定义一个只调用iOS 11中可用的API的宏。我竭尽全力但失败了。这是我的代码。

#ifdef __IPHONE_11_0
if (@available(iOS 11.0, *)) {
    #define KNGTUtilIsIPhoneX [UIApplication sharedApplication].delegate.window.safeAreaInsets.top > 0
} else {
    #define KNGTUtilIsIPhoneX NO
}
#else
#define KNGTUtilIsIPhoneX NO
#endif

似乎宏只能在顶级范围内定义。所以我的代码无法编译。如果我不使用@available,编译器将通过以下消息警告我。

  

'safeAreaInsets'仅适用于iOS 11.0或更高版本

请帮我找一个优雅的解决方案。非常感谢提前!

2 个答案:

答案 0 :(得分:1)

我认为你可以编写一个函数来调用api并定义这个函数。例如,使用您的代码我可以重写。

#define KNGTUtilIsIPhoneX isIphoneX()

BOOL isIphoneX() {
  if (@available(iOS 11.0, *)) {
    return [UIApplication sharedApplication].delegate.window.safeAreaInsets.top > 0;
  }

  return NO;
}

答案 1 :(得分:0)

定义:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

用法:

  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {

  }