如何转到nskeyedunarchiver.unarchiveobject

问题描述 投票:0回答:5

我有一个有效但已弃用的工作代码:

这部分很好:

 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?

swift ios12 nskeyedunarchiver
5个回答
21
投票
的错误,您本可以自己弄清楚的

要能够用自定义类的数组来解码

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

4
投票

// 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正确指出的“翻译”(并保存了我的一天!)。
    

1
投票
我使用此解决方案将逻辑保持原样,并隐藏警告:

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


1
投票

XCODE 14 +ios16


0
投票
guard
    let archivedRecord = try? NSKeyedArchiver.archivedData(withRootObject: defaultRecord, requiringSecureCoding: false),
    let record = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archivedRecord) as? Record
else { return nil }

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.