如何使用const CGFloat

时间:2015-11-09 22:45:10

标签: ios objective-c

如果方法只能在某些iOS版本上使用,我通常会使用respondsToSelector:检查其可用性。

使用const CGFloat声明,这是不可能的。

我尝试使用的特定常量是UIFontWeightBlack,其定义为:

UIKIT_EXTERN const CGFloat UIFontWeightBlack NS_AVAILABLE_IOS(8_2);

检查我的代码运行的iOS版本是否支持此常量的最佳方法是什么?

另外,如果我想支持使用旧版iOS SDK构建我的框架,那么在编译时检查的最佳方法是,使用的SDK是否提供此符号?

我目前会用

进行检查
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_2

有没有办法直接检查符号,而不必依赖/明确指定iOS SDK版本?

2 个答案:

答案 0 :(得分:9)

SDK Compatibility Guide

中介绍了这一点
  

检查外部(外部)常量或通知名称的可用性,方法是将其地址(而不是符号的裸名称)显式比较为NULL或nil。

所以你的代码是:

if (&UIFontWeightBlack != NULL) {
    // It is safe to use the constant
}

答案 1 :(得分:1)

要回答问题的第二部分,请将编译时间检查更改为以下内容:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80200 // 80200 is the value of __IPHONE_8_2

我们希望回退使用宏的值而不是宏本身,因为在旧版本的iOS SDK中没有定义宏。

正如您在评论中提到的,Conditionally Compiling for Different SDKs部分介绍了这一点:

  

以下代码摘录演示了这一点。注意使用   数值1050代替__MAC_10_5中的符号#if   比较子句:如果代码加载到较旧的系统上   不包括符号定义,比较仍然有效。