在 Swift 3 中,我截取了一些代码,这些代码调用 Objective-C 运行时来检查某个类是否存在。
guard let managerClass = NSClassFromString("ASIdentifierManager") as? NSObjectProtocol else {
return nil
}
这将返回AnyClass
实例,并且可以转换为NSObjectProtocol
- 因此我可以调用responds
和perform
等方法来使用选择器。
在 Swift 4 中,这在运行时仍然有效,但会发出警告:
选自《任何班级?(也称为"可选")到不相关的类型"NSObjectProtocol"总是失败
奇怪的是它仍然有效,但我担心某个 Swift 版本会杀死代码。
摆脱此警告的正确方法是什么?我应该将对象转换为什么,以便能够动态地对其执行选择器?
看起来你需要先从AnyObject.Type
转换为AnyObject
,以说服编译器你正在谈论一个实例(尽管你知道是一个元类的实例):
guard
let klass = NSClassFromString("ASIdentifierManager"),
let managerClass = klass as AnyObject as? NSObjectProtocol else
{
return nil
}
我不确定这是否应该被视为编译器错误。我敢打赌不会,并且有一些 Swiftian 的原因,即在 Swift 上下文中NSObjectProtocol
不适用于 ObjC 类型的对象。
你应该投射到NSObjectProtocol.Type
:
guard let managerClass = NSClassFromString("ASIdentifierManager") as? NSObjectProtocol.Type else {
return nil
}