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- 所以我可以调用像responds和perform使用选择器这样的方法。
在 Swift 4 中,这在运行时仍然有效,但会发出警告:
来自“AnyClass?”的演员表 (又名“可选”)到不相关的类型“NSObjectProtocol”总是失败
奇怪的是它仍然有效,但我担心某个 Swift 版本会杀死代码。
摆脱此警告的正确方法是什么?我应该将对象转换为什么,以便能够对其动态执行选择器?
看起来您需要先从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 类型的对象。
你应该投射到NSObjectProtocol.Type:
guard let managerClass = NSClassFromString("ASIdentifierManager") as? NSObjectProtocol.Type else {
return nil
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |