Добавлен пользовательский каркас, теперь Swift не может разархивировать данные

У меня есть довольно тривиальное приложение Swift, которое имеет класс модели с именем DemoNote, Массив DemoNote экземпляры читаются / пишутся через архивирование с ключом. Это работало нормально, в то время как DemoNote был включен в приложение.

Но потом я переехал DemoNote.swift в новую пользовательскую среду под названием DemoSharedCode, Помимо того, чтобы убедиться, что Xcode использует фреймворк в целевом приложении, я убедился, что

  • отметка DemoNote и его переменные и методы, как public чтобы они были видны за рамками
  • добавлять import DemoSharedCode для любых классов, которые хотят использовать DemoNote

Так что теперь компилятор доволен. Но во время выполнения разархивирование завершается с этой ошибкой:

2015-02-17 12:12:53.417 DemoNotesSwift[70800:16504104] *** Terminating app due to 
uncaught exception 'NSInvalidUnarchiveOperationException', reason:
'*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class
(DemoNotesSwift.DemoNote)'

В приведенном выше DemoNotesSwift это имя приложения, DemoNote имя класса, и строка кода пытается разархивировать объекты из NSData блоб:

let savedObjects = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as? [(DemoNote)]

Я предполагаю, что переезд DemoNote к фреймворку означает, что имя его модуля изменилось, что нарушает разархивирование, но я не уверен в этом. Я также не уверен, что с этим делать - может быть, мне нужно позвонить +setClass:forClassName: на unarchiver, но если так, я не знаю, что аргументы будут.

1 ответ

Решение

Перемещение DemoNote из приложения в фреймворк изменил имя модуля, что означало, что NSKeyedUnarchiver не удалось найти экземпляры заархивированного класса из-за несоответствия имени. Исправление было добавить эту строку перед разархивированием:

NSKeyedUnarchiver.setClass(DemoNote.self, forClassName: "DemoNotesSwift.DemoNote")

В этом случае, DemoNote.self получает текущее полное имя класса и DemoNotesSwift.DemoNote это то, что раньше вызывали класс, когда он был частью приложения.

Это было необходимо только потому, что ранее у меня были данные, которые я хотел сохранить.

Другие вопросы по тегам