Добавлен пользовательский каркас, теперь 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
это то, что раньше вызывали класс, когда он был частью приложения.
Это было необходимо только потому, что ранее у меня были данные, которые я хотел сохранить.