弱连接 – 检查一个类是否存在并使用该类

我正在尝试创build一个通用的iPhone应用程序,但是它只使用了一个新版本的SDK中定义的类。 该框架存在于较旧的系统上,但在框架中定义的类没有。

我知道我想要使用某种弱链接,但是我可以find任何有关运行时检查的文档,以检查是否存在函数 – 如何检查类是否存在?

TLDR

当前:

  • Swiftif #available(iOS 9, *)
  • Obj-C,iOSif (@available(iOS 11.0, *)
  • Obj-C,OS Xif (NSClassFromString(@"UIAlertController"))

遗产:

  • Swift(2.0之前的版本)if objc_getClass("UIAlertController")
  • Obj-C,iOS(4.2之前的版本)if (NSClassFromString(@"UIAlertController"))
  • Obj-C,iOS(11.0之前的版本)if ([UIAlertController class])

Swift 2+

尽pipe历史上build议检查function(或类的存在),而不是特定的操作系统版本,但由于引入了可用性检查,所以在Swift 2.0中效果不佳。

改用这种方法:

 if #available(iOS 9, *) { // You can use UIStackView here with no errors let stackView = UIStackView(...) } else { // Attempting to use UIStackView here will cause a compiler error let tableView = UITableView(...) } 

注意:如果您尝试使用objc_getClass() ,则会出现以下错误:

⛔️“UIAlertController”仅适用于iOS 8.0或更高版本。


以前版本的Swift

 if objc_getClass("UIAlertController") != nil { let alert = UIAlertController(...) } else { let alert = UIAlertView(...) } 

请注意, objc_getClass()NSClassFromString()objc_lookUpClass()更可靠 。


Objective-C,iOS 4.2+

 if ([SomeClass class]) { // class exists SomeClass *instance = [[SomeClass alloc] init]; } else { // class doesn't exist } 

有关更多详细信息,请参阅code007的答案 。


OS X或以前版本的iOS

 Class klass = NSClassFromString(@"SomeClass"); if (klass) { // class exists id instance = [[klass alloc] init]; } else { // class doesn't exist } 

使用NSClassFromString() 。 如果返回nil ,则类不存在,否则返回可以使用的类对象。

根据苹果在本文中推荐的方式:

[…]您的代码将使用NSClassFromString()testing[a]类的存在性,如果该类存在,将返回一个有效的类对象,如果不存在则返回nil。 如果类存在,你的代码可以使用它[…]

对于使用iOS 4.2或更高版本的基本SDK的新项目,这种新的推荐方法是使用NSObject类方法在运行时检查弱链接类的可用性。 即

 if ([UIPrintInteractionController class]) { // Create an instance of the class and use it. } else { // Alternate code path to follow when the // class is not available. } 

来源: https : //developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3

这个机制使用了NS_CLASS_AVAILABLEmacros,它可以在iOS的大多数框架中使用(注意可能有一些框架还不支持NS_CLASS_AVAILABLE,请检查iOS版本说明)。 额外的设置configuration可能需要在上面提供的Apple文档链接中读取,但是这种方法的优点是可以进行静态types检查。