как разархивировать списки в пакете, используя путь в Swift 5

#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