在swift 3中,我截取了一段代码,它调用objective-c运行时来检查是否存在某个类。

guard let managerClass = NSClassFromString("ASIdentifierManager") as? NSObjectProtocol else {
    return nil
}

这将返回AnyClass实例,并且可以转换为NSObjectProtocol-因此我可以调用respondsperform等方法来使用选择器。
在swift 4中,这在运行时仍然有效,但会发出警告:
从“任何一个阶级?”(也称为“可选”)到不相关类型“nsobjectprotocol”总是失败
奇怪的是它仍然有效,但我担心某个快速版本会杀死代码。
怎样才能消除这个警告呢?为了能够动态地对对象执行选择器,我应该将对象转换成什么?

最佳答案

看起来您需要先从AnyObject.Type转换到AnyObject,以使编译器相信您所说的是一个实例(尽管您知道,它是一个元类的实例):

    guard
        let klass = NSClassFromString("ASIdentifierManager"),
        let managerClass = klass as AnyObject as? NSObjectProtocol else
    {
        return nil
    }

我不确定这是否应该被认为是编译器错误。我敢打赌不会,而且在快速上下文中,NSObjectProtocol不适用于objc类型的对象有一些快速的原因。

07-26 06:24