如何从iOS 12.0开始使用UserDefaults归档和取消归档SKPhysicsBody数组



我可以使用UserDefaults成功地归档和取消归档SKPhysicsBody的数组,如下所示,但取消归档过程已被弃用。这是警告信息。。。"unarchiveObject(with:("在iOS 12.0中已弃用:改为使用+unarchiveObjectOfClass:fromData:error:。我一直在绕这个圈子转,但仍然没有工作。我该如何遵守这一点?我的代码在下面。

要存档。。。

do { try UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject:Sat1shapes,requiringSecureCoding:true), forKey: "Sat1shapes")
}
catch { 
print(error)}

要取消存档。。。

var Sat1shapes: [SKPhysicsBody] = []

if let dataObject = UserDefaults.standard.value(forKey: "Sat1shapes") as? NSData {
Sat1shapes = NSKeyedUnarchiver.unarchiveObject(with: dataObject as Data) as! [SKPhysicsBody]
}

这是避免警告的更新代码,但它没有像不推荐使用的版本那样存储[SKPhysicsBody]数组。

var Sat1shapes: [SKPhysicsBody] = []

let dataObject = UserDefaults.standard.value(forKey: "Sat1shapes") as? NSData
do  {
Sat1shapes = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, SKPhysicsBody.self], from: dataObject! as Data) as! [SKPhysicsBody]

} catch {
print(error)
}

类似的内容。仔细观察这个过程中的每一步,找出你在哪里遇到了麻烦。

func writeBody(_ body: SKPhysicsBody) {
do {
// Convert from SKPhysicsBody to Data
let data = try NSKeyedArchiver.archivedData(withRootObject: body, requiringSecureCoding: false)
// Write Data instance into UserDefaults
UserDefaults.standard.set(data, forKey: "body")
print("Wrote body: (String(reflecting: body))")
} catch {
print("Failed to write body: (error.localizedDescription)")
}
}
func readBody() -> SKPhysicsBody? {
// Read body from UserDefaults (as Data).
guard let dataObject = UserDefaults.standard.object(forKey: "body") else {
print(#"No data was stored in UserDefaults under "body" key"#)
return nil
}

guard let data = dataObject as? Data else {
print(#"Object stored in UserDefaults "body" key is not Data type."#)
return nil
}

do {
return try NSKeyedUnarchiver.unarchivedObject(ofClass: SKPhysicsBody.self, from: data)
} catch {
print("Failed to unarchive SKPhysicsBody from Data: (error.localizedDescription)")
return nil
}
}

更新:添加阵列变体

func writeBodies(_ bodies: [SKPhysicsBody]) {
do {
// Convert from SKPhysicsBody to Data
let data = try NSKeyedArchiver.archivedData(withRootObject: bodies, requiringSecureCoding: false)
// Write Data instance into UserDefaults
UserDefaults.standard.set(data, forKey: "bodies")
print("Wrote bodies: (String(reflecting: bodies))")
} catch {
print("Failed to write bodies: (error.localizedDescription)")
}
}
func readBodies() -> [SKPhysicsBody]? {
// Read body from UserDefaults (as Data).
guard let dataObject = UserDefaults.standard.object(forKey: "bodies") else {
print(#"No data was stored in UserDefaults under "bodies" key"#)
return nil
}

guard let data = dataObject as? Data else {
print(#"Object stored in UserDefaults "bodies" key is not Data type."#)
return nil
}

do {
return try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: SKPhysicsBody.self, from: data)
} catch {
print("Failed to unarchive SKPhysicsBody from Data: (error.localizedDescription)")
return nil
}
}

最新更新