在swift 3中,我截取了一段代码,它调用objective-c运行时来检查是否存在某个类。
guard let managerClass = NSClassFromString("ASIdentifierManager") as? NSObjectProtocol else {
return nil
}
这将返回
AnyClass
实例,并且可以转换为NSObjectProtocol
-因此我可以调用responds
和perform
等方法来使用选择器。在swift 4中,这在运行时仍然有效,但会发出警告:
从“任何一个阶级?”(也称为“可选”)到不相关类型“nsobjectprotocol”总是失败
奇怪的是它仍然有效,但我担心某个快速版本会杀死代码。
怎样才能消除这个警告呢?为了能够动态地对对象执行选择器,我应该将对象转换成什么?
最佳答案
看起来您需要先从AnyObject.Type
转换到AnyObject
,以使编译器相信您所说的是一个实例(尽管您知道,它是一个元类的实例):
guard
let klass = NSClassFromString("ASIdentifierManager"),
let managerClass = klass as AnyObject as? NSObjectProtocol else
{
return nil
}
我不确定这是否应该被认为是编译器错误。我敢打赌不会,而且在快速上下文中,
NSObjectProtocol
不适用于objc类型的对象有一些快速的原因。