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

NSKeyedArchiver 不推荐使用的方法问题

NSKeyedArchiver archiveRootObject 总是返回 NO

NSKeyedUnarchiver.unarchiveObject 不工作 [重复]