#ios #swift #nskeyedunarchiver
Вопрос:
Краткая версия: Как получить доступ к архивному файлу в пакете для разархивирования unarchivedObject(ofClass:from:)
. Основная проблема заключается в переходе от пути (строки или URL-адреса), к Data
которому требуется метод.
Длинная версия: У меня есть много списков, содержащих иерархии SCNNode, хранящихся в виде списков в ресурсах пакета.
Я смог получить к ним доступ в Swift 3 с помощью:
let fileName = MoleName.DNA_ideal_comps // retrieves String
let filePath = getFilePath(fileName)
guard let components = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? [SCNNode] , components.count >= 4
else { // no value for this key, or not enough nodes
print("Couldn't find molecule (DNA_ideal_comps)")
return
} // [ atoms_A, bonds_A, atoms_B, bonds_B ]
scaleNode_2 = components[0] // DNA A
fixedNode_2 = components[1] // bonds
scaleNode_3 = components[2] // DNA B
fixedNode_3 = components[3] // bonds
// where filePath is:
func getFilePath(_ fileName: String) -> String {
if let path = Bundle.main.path(forResource: fileName, ofType: "plist") {
return path
}
return "path could not be found"
}
Вот fileName
имя plist
для извлечения, «DNA_ideal_comps» в этом примере. Я создал их независимо от активной программы из-за огромного объема данных; некоторые из этих списков содержат более 30 000 элементов, а всего около 90.
Описанная выше попытка разархивирования устарела, и я изо всех сил пытался ее заменить. Моя лучшая попытка до сих пор:
guard let components = NSKeyedUnarchiver.unarchivedObject(ofClass: SCNNode.self, from: moleData), components.count >= 4
Но это не удается, так как невозможно преобразовать значение типа «Строка» в ожидаемый тип аргумента «Данные». В отличие от метода в Swift 3, здесь, по-видимому, невозможно использовать путь к объекту для его извлечения.
Есть ли способ получить доступ к этим спискам, используя этот метод? Есть ли другой более подходящий метод?
Ответ №1:
Основная проблема заключается в переходе от пути (строки или URL-адреса) к данным, которые требуются методом
Ну, это достаточно тривиально; просто вызовите инициализатор данных, который считывает данные из файла на диске. Затем вы бы расшифровали данные, позвонив NSKeyedUnarchiver.unarchivedObject(ofClass: SCNNode.self, from: theData)
.
https://developer.apple.com/documentation/foundation/data/3126626-init
https://developer.apple.com/documentation/foundation/nskeyedunarchiver/2983380-unarchivedobject
Тем не менее, я сбит с толку, почему вы используете NSKeyedUnarchiver для чтения файла plist. Файл plist будет считан с помощью объекта PropertyListSerialization.
https://developer.apple.com/documentation/foundation/propertylistserialization