Swift 4 Objective-C Runtime and casting to NSObjectProtocol



在 Swift 3 中,我截取了一些代码,这些代码调用 Objective-C 运行时来检查某个类是否存在。

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

这将返回AnyClass实例,并且可以转换为NSObjectProtocol- 因此我可以调用respondsperform等方法来使用选择器。

在 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
}

最新更新