检查Swift中是否存在全局函数

时间:2016-07-13 13:42:36

标签: ios swift introspection

是否可以检测是否定义了某些全局函数(非类方法)(在iOS中)?类似respondsToSelector的类......

2 个答案:

答案 0 :(得分:6)

Swift目前不支持查找全局功能。

对于C函数(Apple的框架中的大多数全局函数都是C函数),至少有两种方法:

  • 使用弱链接符号
  • 动态链接器API:dlopen

如果可以找到符号,则动态检查(在运行时)。

以下是检查UIGraphicsBeginImageContextWithOptions(iOS 4引入)是否可用的示例:

void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) __attribute__((weak));

static inline BOOL hasUIGraphicsBeginImageContextWithOptions() {
    return UIGraphicsBeginImageContextWithOptions != NULL;
}

使用dlsym

进行同样的检查
#import <dlfcn.h>

static inline BOOL hasUIGraphicsBeginImageContextWithOptions() {
    return dlsym(RTLD_SELF, "UIGraphicsBeginImageContextWithOptions") != NULL;
}

使用dlsym的好处是您不需要声明,并且可以轻松移植到Swift。

答案 1 :(得分:0)

不,在Swift中不可能。

Even respondsToSelector使用Obj-C运行时,只能用于Obj-C中可用的函数。