NSKeyedArchiver 返回 nil Swift 4.2
Posted
技术标签:
【中文标题】NSKeyedArchiver 返回 nil Swift 4.2【英文标题】:NSKeyedArchiver returning nil Swift 4.2 【发布时间】:2019-03-01 17:26:25 【问题描述】: let lessons = Lessons(definition: "testo", photo: url)
SaveUtil.saveLessons(lessons: lessons!)
let x = SaveUtil.loadLessons()
所以一切都编译并运行,但 x 为零....我正在尝试使这个 ios12/swift 4.2 兼容,但不知道缺少什么。谢谢!
class SaveUtil
static func saveLessons(lessons: Lessons)
let data = try! NSKeyedArchiver.archivedData(withRootObject: lessons, requiringSecureCoding: false)
UserDefaults.standard.set(data, forKey: "lessons")
static func loadLessons() -> [Lessons]?
let data = UserDefaults.standard.data(forKey: "lessons")
return try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data!) as? [Lessons]
【问题讨论】:
那是因为你没有指定类名。 @ElTomato 你能详细说明一下吗? 归档根对象的类型是Lessons
,而不是[Lessons]
。
@OOPer 是的! xcode autofix 做到了……而且我是如此的菜鸟迅速飞过我。请提交答案以获得简单的分数! ;-)
【参考方案1】:
loadSession 返回一个课程数组。 “作为?”将检查类型。由于未归档的对象不是数组,它将返回 nil。您正在将其归档为课程对象并将其取消归档为课程数组对象。
static func loadLessons() -> Lessons?
let data = UserDefaults.standard.data(forKey: "lessons")
return try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data!) as? Lessons
下面是有效的代码。
class Lessons : NSObject,NSCoding
var definitionText:String
var photoURL:String
init(definition:String,photoURL:String)
self.definitionText = definition
self.photoURL = photoURL
func encode(with aCoder: NSCoder)
aCoder.encode(self.definitionText, forKey: "definitionText")
aCoder.encode(self.photoURL, forKey: "photoURL")
required convenience init?(coder aDecoder: NSCoder)
self.init(definition: "", photoURL: "")
self.definitionText = aDecoder.decodeObject(forKey: "definitionText") as! String
self.photoURL = aDecoder.decodeObject(forKey: "photoURL") as! String
class SaveUtil
static func saveLessons(lessons: Lessons)
let data = NSKeyedArchiver.archivedData(withRootObject: lessons)
UserDefaults.standard.set(data, forKey: "lessons")
static func loadLessons() -> Lessons?
let data = UserDefaults.standard.data(forKey: "lessons")
return try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data!) as? Lessons
运行代码后,它将返回对象。
let lessons = Lessons(definition: "testo", photoURL: "photo.jpg")
SaveUtil.saveLessons(lessons: lessons)
let x = SaveUtil.loadLessons()
print("\(x?.photoURL)")
【讨论】:
以上是关于NSKeyedArchiver 返回 nil Swift 4.2的主要内容,如果未能解决你的问题,请参考以下文章
NSKeyedArchiver unarchiveObjectWithData 返回具有 nil 值的对象
NSKeyedUnarchiver unarchiveObjectWithData 返回 nil
NSKeyedArchiver.unarchiveObject Swift 3 iOS 10