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

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

Swift目前不支持查找全局function。

对于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  static inline BOOL hasUIGraphicsBeginImageContextWithOptions() { return dlsym(RTLD_SELF, "UIGraphicsBeginImageContextWithOptions") != NULL; } 

使用dlsym的优点是你不需要声明,并且它可以轻松移植到Swift。

不,这在Swift中是不可能的。

甚至respondsToSelector使用Obj-C运行时,并且只能用于Obj-C中可用的函数。