我正在尝试创建一款通用的iPhone应用程序,但是它使用了仅在新版本SDK中定义的类。该框架存在于旧系统中,但是在框架中定义的类不存在。
我知道我想要使用某种弱链接,但是我能找到的所有文档都是关于函数存在的运行时检查 - 我如何检查一个类是否存在?
我正在尝试创建一款通用的iPhone应用程序,但是它使用了仅在新版本SDK中定义的类。该框架存在于旧系统中,但是在框架中定义的类不存在。
我知道我想要使用某种弱链接,但是我能找到的所有文档都是关于函数存在的运行时检查 - 我如何检查一个类是否存在?
当前:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
传统:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
虽然历史上推荐检查能力(或类存在)而不是特定的操作系统版本,但由于引入了可用性检查,在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 或更高版本中可用。
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(...)
} else {
let alert = UIAlertView(...)
}
objc_getClass()
比NSClassFromString()
或objc_lookUpClass()
更可靠。
if ([SomeClass class]) {
// class exists
SomeClass *instance = [[SomeClass alloc] init];
} else {
// class doesn't exist
}
请参考code007的答案以获取更多细节。
Class klass = NSClassFromString(@"SomeClass");
if (klass) {
// class exists
id instance = [[klass alloc] init];
} else {
// class doesn't exist
}
NSClassFromString()
。如果它返回nil
,则该类不存在,否则它将返回可用的类对象。[...]您的代码应使用
NSClassFromString()
来测试类的存在性,如果类存在,则返回有效的类对象,否则返回nil
。 如果该类存在,则您的代码可以使用它[...]
NSClassFromString
返回的Class
实例来创建它(将其分配给id
),并在该实例上调用选择器。 - psychotik对于使用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.
}
这种机制使用NS_CLASS_AVAILABLE宏,该宏适用于iOS中的大多数框架(请注意,可能有一些框架目前不支持NS_CLASS_AVAILABLE - 请查看iOS发布说明)。可能还需要额外的设置配置,可以在上面提供的Apple文档链接中阅读,但这种方法的优点是可以获得静态类型检查。
UIAlertController
的代码时,仍要支持iOS 7。code007的答案是正确的,但额外需要进行的配置是将项目中的UIKit弱链接(从“必需”改为“可选”)(至少对于此情况如此)。 - Evan R