У меня проблема с NSClassFromString
, возвращающим ноль.
Код работал в прошлом, но после некоторого рефакторинга и обновления до 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. Запуск на iPad с iOS 12, целевой iOS 10.