Код: Выделить всё
NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? NSMutableArray
Код: Выделить всё
NSKeyedUnarchiver.unarchivedObject(ofClass: NSMutableArray.self, from: data)
Наш исходный 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)
Есть ли лучшая замена 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")
}
}
NSKeyedUnarchiver.unarchiveTopLevelObjectWithData
в
NSKeyedUnarchiver.unarchivedObject
Подробнее здесь: https://stackoverflow.com/questions/780 ... thdatadata
Мобильная версия