Swift 4 Objective-C 运行时和转换为 NSObjectProtocol

Leg*_*ess 4 objective-c-runtime foundation swift swift4

在 Swift 3 中,我有一段代码调用 Objective-C 运行时来检查某个类是否存在。

guard let managerClass = NSClassFromString("ASIdentifierManager") as? NSObjectProtocol else {
    return nil
}
Run Code Online (Sandbox Code Playgroud)

这将返回AnyClass实例并且它可以转换为NSObjectProtocol- 所以我可以调用像respondsperform使用选择器这样的方法。

在 Swift 4 中,这在运行时仍然有效,但会发出警告:

来自“AnyClass?”的演员表 (又名“可选”)到不相关的类型“NSObjectProtocol”总是失败

奇怪的是它仍然有效,但我担心某个 Swift 版本会杀死代码。

摆脱此警告的正确方法是什么?我应该将对象转换为什么,以便能够对其动态执行选择器?

Jos*_*ell 6

看起来您需要先从AnyObject.Typeto 转换AnyObject以说服编译器您正在谈论一个实例(尽管您知道是元类的实例):

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

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


Ork*_*nov 0

你应该投射到NSObjectProtocol.Type

guard let managerClass = NSClassFromString("ASIdentifierManager") as? NSObjectProtocol.Type else {
    return nil
}
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的。虽然您可以在没有警告的情况下进行此转换,但您不能再使用“responds”和“perform”方法,因为这是一种类型,不再是实例。 (2认同)