我遇到NSClassFromString
返回nil的问题。
代码在过去一直很稳定,但经过一些重构和更新到iOS 12之后,它已不再适用了......
代码:
func recreateHistoryAction(pack: (id: String, date: Date, type: String, data: Data), done: @escaping (HistoryAction) -> ()) {
if NSClassFromString(pack.type) as? HistoryAction.Type == nil {
AnalyticsAssistant.shared.logError("pack.type \"\(pack.type)\" as class \"\(String(describing: NSClassFromString(pack.type)))\" does not conform to HistoryAction.Type.")
}
--> let history_action_type = NSClassFromString(pack.type) as! HistoryAction.Type
do {
let tree = try JSONSerialization.jsonObject(with: pack.data, options: []) as! [String: Any]
let history_action: HistoryAction = history_action_type.init(tree: tree)
// ...
// ...
}
打印日志,从而导致HistoryAction.Type
的强制转换在下一行失败。
日志:
pack.type“Pixel_Nodes.CreateNodeHistoryAction”作为类“nil”吗 不符合HistoryAction.Type。
我已经仔细检查了应用程序命名空间和类名,这不是问题。
子类结构:
HistoryAction -> NodeHistoryAction -> CreateNodeHistoryAction
我在调试区注意到一些奇怪的东西; pack
元组代表两次;一次作为具有良好数据的局部变量,一次作为具有奇数数据的参数(pack.date
是2001-01-01且pack.type
未显示任何内容)。
这是来自箭头断点处的调试区域:
@OOPer提到这只是调试器的一个错误。
这是崩溃后pack
的弹出窗口:
还有其他人遇到过这个吗? 或者我错过了一些明显的东西?
在macOS Mojave,Xcode 10,Swift 4上构建。 在iOS 12的iPad上运行,目标是iOS 10。