Замена NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) [дубликат]IOS

Программируем под IOS
Ответить
Anonymous
 Замена NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) [дубликат]

Сообщение Anonymous »

В настоящее время я обнаружил, что в нашем проекте iOS Swift для установки и получения объектов есть функция:

Код: Выделить всё

NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? NSMutableArray
устарела и компилятор рекомендует использовать

Код: Выделить всё

NSKeyedUnarchiver.unarchivedObject(ofClass: NSMutableArray.self, from: data)
вместо этого. Однако NSKeyedUnarchiver.unarchivedObject всегда возвращает ноль.
Наш исходный NSMutableArrary, именованный массив, хранит наши объекты, например:

Код: Выделить всё

public class TestInfo {
public var name1 = ""
public var name2 = ""
....
}
Эти объекты были установлены ранее с помощью:

Код: Выделить всё

NSKeyedArchiver.archivedData(withRootObject: array, requiringSecureCoding: false)

set(data, forKey: key)
Мы попробовали несколько разных методов, таких как:

Код: Выделить всё

NSKeyedUnarchiver.unarchivedObject(ofClass: NSMutableData.self, from: data)
но все не удалось с возвращаемым значением nil.
Есть ли лучшая замена unarchiveTopLevelObjectWithData?
=========================================== ==========
Просто несколько ответов на комментарии (и спасибо за комментарии)
Если мы используем следующее коды для получения сообщений об ошибках:

Код: Выделить всё

do {

let obj = try NSKeyedUnarchiver.unarchivedObject(ofClass: NSMutableArray.self, from: data)

if obj != nil {
return obj
}
} catch {
print("error: \(error)")
}
Сообщения об ошибках:
ошибка: Error Domain=NSCocoaErrorDomain Code=4864 "значение для ключа 'NS.objects ' имел неожиданный класс 'Test.TestInfo' (0x1029d4ca0) [/private/var/folders/vk/gjkz3ccx77v2gg880jsmc4780000gn/X/848ED575-5DDA-552B-8779-700AC9EF5015/d/Wrapper/Test.app].
Разрешенные классы:
{(
"'NSMutableArray' (0x1e112d6e0) [/System/Library/Frameworks/CoreFoundation.framework]"
)}" UserInfo={NSDebugDescription=значение для ключа ' NS.objects» имел неожиданный класс «Test.TestInfo» (0x1029d4ca0) [/private/var/folders/vk/gjkz3ccx77v2gg880jsmc4780000gn/X/848ED575-5DDA-552B-8779-700AC9EF5015/d/Wrapper/Test.app].Разрешенные классы:
{(
"'NSMutableArray' (0x1e112d6e0) [/System/Library/Frameworks/CoreFoundation.framework]"
)}

в TestInfo.swift у нас есть:

Код: Выделить всё

import Foundation

public class TestInfo : NSObject, NSCoding, NSSecureCoding {
public static var supportsSecureCoding: Bool { true }

public var name1 = "";
public var name2 = "";

public override init() {

}

// MARK: - NSCoding
public required init(coder aDecoder: NSCoder) {
name1 = aDecoder.decodeObject(forKey: "name1") as! String
name2 = aDecoder.decodeObject(forKey: "name2") as! String

}

public func encode(with aCoder: NSCoder) {
aCoder.encode(name1, forKey: "name1")
aCoder.encode(name2, forKey: "name2")
}
}
Лично мне интересно, почему Apple хочет отказаться от старой четкой и аккуратной функции и затруднить переход от нее
NSKeyedUnarchiver.unarchiveTopLevelObjectWithData
в
NSKeyedUnarchiver.unarchivedObject

Подробнее здесь: https://stackoverflow.com/questions/780 ... thdatadata
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»