我有一个有效但已弃用的工作代码:
这部分很好:
let archived = try? NSKeyedArchiver.archivedData(withRootObject: [defaultRecord] as NSArray, requiringSecureCoding: false)
this this debecectect:
let records = NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [Record]
ios 12.0中对'nunarchiveObject(与:)'弃用:使用 +unarchivedObjectOfClass:fromData:错误:而不是
nots and nyt the,我找不到一种使用建议方法的方法,而我尝试的每种组合都不会出现错误。任何工作示例?
新API用来存档数组有点棘手。 如果您不忽略
try?
要能够用自定义类的数组来解码
unarchivedObject(ofClasses:from:
plural
form
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
但是,为什么您将cartive cartive cartive cartive cartive cartive?如果您存档单个对象,则可以离开班级,然后写
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
序列化。它是swiftier
,不需要继承
NSObject
。
上面的方法对我不合理,我做到了,它起作用了:
NSKeyedUnarchiver.unarchivedObject(ofClasses: [Record.self], from: archived)
如果有人对Objective C
// pointer to storage for error message
NSError *error = nil;
// read data from "dataPath" location
NSData *codedData = [[NSData alloc] initWithContentsOfFile:dataPath];
// create a set of root class (the array) and the data object class
NSSet<Class> *classes = [NSSet setWithObjects:NSArray.class, Record.class, nil];
// read using classes, not only single class
NSArray *data = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:codedData error:&error];
,这只是代码@Vadian正确指出的“翻译”(并保存了我的一天!)。
func clone<T: UIView>() throws -> T {
let data = try NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false)
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
unarchiver.requiresSecureCoding = false
return try unarchiver.decodeTopLevelObject(of: T.self, forKey: "root")
}
do {
return try NSKeyedUnarchiver(forReadingFrom: unarchivedObject as Data) as? [Record]
} catch {
return nil
}
Just使用Initfunc
guard
let archivedRecord = try? NSKeyedArchiver.archivedData(withRootObject: defaultRecord, requiringSecureCoding: false),
let record = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archivedRecord) as? Record
else { return nil }