Использование нового API для архивации массива немного сложно.
Вы могли бы понять это сами, если бы не игнорировали ошибки с try?
?
Чтобы иметь возможность декодировать массив пользовательского класса с помощью unarchivedObject(ofClass:from:
, необходимо использовать множественное число форма unarchivedObject(ofClasses:from:
и указать как NSArray
(!), Так и пользовательский класс. Далее ваш класс должен принять NSSecureCoding
class Record : NSObject, NSSecureCoding {
static var supportsSecureCoding: Bool {
return true
}
....
do {
let archived = try NSKeyedArchiver.archivedData(withRootObject: [defaultRecord], requiringSecureCoding: false)
let records = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, Record.self], from: archived) as! [Record]
print(records)
} catch { print(error) }
Но почему вы архивируете defaultRecord
как массив вообще? Если вы заархивировали один объект, вы можете оставить свой класс таким, какой он есть, и написать
do {
let archived = try NSKeyedArchiver.archivedData(withRootObject: defaultRecord, requiringSecureCoding: false)
let record = try NSKeyedUnarchiver.unarchivedObject(ofClass: Record.self, from: archived)
let records = [record]
print(records)
} catch { print(error) }
Примечание: попробуйте сериализовать класс с Codable
. Он быстрее и не требует наследования от NSObject
.