当前位置: 首页 > 面试题库 >

尝试在Swift 3中保存自定义对象时尝试插入非属性列表对象

章锦
2023-03-14
问题内容

我有一个符合NSCoding协议的简单对象。

import Foundation

class JobCategory: NSObject, NSCoding {
    var id: Int
    var name: String
    var URLString: String

    init(id: Int, name: String, URLString: String) {
        self.id = id
        self.name = name
        self.URLString = URLString
    }

    // MARK: - NSCoding
    required init(coder aDecoder: NSCoder) {
        id = aDecoder.decodeObject(forKey: "id") as? Int ?? aDecoder.decodeInteger(forKey: "id")
        name = aDecoder.decodeObject(forKey: "name") as! String
        URLString = aDecoder.decodeObject(forKey: "URLString") as! String
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(id, forKey: "id")
        aCoder.encode(name, forKey: "name")
        aCoder.encode(URLString, forKey: "URLString")
    }
}

我正在尝试将其实例保存在其中,UserDefaults但是由于以下错误,它一直失败。

由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“试图为关键jobCategory插入非属性列表对象”

这是我要保存的代码UserDefaults

enum UserDefaultsKeys: String {
    case jobCategory
}

class ViewController: UIViewController {

    @IBAction func didTapSaveButton(_ sender: UIButton) {
        let category = JobCategory(id: 1, name: "Test Category", URLString: "http://www.example-job.com")

        let userDefaults = UserDefaults.standard
        userDefaults.set(category, forKey: UserDefaultsKeys.jobCategory.rawValue)
        userDefaults.synchronize()
    }
}

我用普通字符串将枚举值替换为key,但是仍然发生相同的错误。知道是什么原因造成的吗?


问题答案:

您需要创建Data从您的实例JobCategory使用实例NSKeyedArchiver.archivedData(withRootObject:)和存储Data例如在UserDefaults使用后解除封存NSKeyedUnarchiver.unarchiveObject(with:),因此,尝试这样的。

用于将数据存储在UserDefaults

let category = JobCategory(id: 1, name: "Test Category", URLString: "http://www.example-job.com")
let encodedData = NSKeyedArchiver.archivedData(withRootObject: category, requiringSecureCoding: false)
let userDefaults = UserDefaults.standard
userDefaults.set(encodedData, forKey: UserDefaultsKeys.jobCategory.rawValue)

用于从中检索数据UserDefaults

let decoded  = UserDefaults.standard.object(forKey: UserDefaultsKeys.jobCategory.rawValue) as! Data
let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! JobCategory
print(decodedTeams.name)


 类似资料:
  • 在响应中,我们接收一个xml文件,然后转换为SimpleXMLElement,然后根据需要访问元素和属性。然而,当直接从字符串响应加载xml而不是从保存的响应加载xml时,我们得到了“尝试获取非对象的属性”。 当使用simplexml\u load\u字符串而不是simplexml\u load\u文件时,什么会导致xml失败? 以下是xml文件的一个片段:

  • 我正在使用Java8开发Spring Boot Version2,当我试图在“createTopic”方法中将一个新的列表对象添加到预定义的列表对象(即topicList)中时,我得到了一个错误。 ** TopicService.java ** ** 2020-04-15 19:52:27.172错误15312---[nio-8080-exec-2]O.A.C.C.C.[.[.[/].[dispa

  • 致命异常:main java.lang.RuntimeException:无法启动活动组件Info{com.example.increative/com.example.increve.comments}:java.lang.ClassCastException:Android.os.Parcelable[]无法强制转换为Com.example.increve.MessageModel.Token

  • 我是反应式编程新手,目前我有以下问题。我有一个人类的目标。具有属性id、firstName、lastName和List的java类 人类JAVA Hobbies.java 人Config.java 人形路由器。JAVA 人类训练师。JAVA 人力服务。JAVA 人性化的应用。JAVA 我在POST请求的正文中放入Postman的json对象如下所示: docker撰写。亚马尔 应用属性 我真的不知

  • 我使用ModelMapper的方式如下: 我有几个转换器类是Spring组件,它们注册自定义ModelMapper映射 但是当Spring启动时,由于调用了configure函数,并且源代码为null,所以我得到了以下错误。 这怎么可能呢? 我用错了吗? bean是这样声明的,Foo和FooModel不是最终的 重要编辑 实际上,即使在主类内的函数中显式创建映射,也会得到相同的NullPointe

  • 当我使用实体框架保存实体时,我自然假设它只会尝试保存指定的实体。但是,它也在尝试保存该实体的子实体。这会导致各种完整性问题。如何强制EF只保存我要保存的实体并因此忽略所有子对象? 如果我手动将属性设置为null,我会收到一个错误“操作失败:无法更改关系,因为一个或多个外键属性不可为空。”这是非常适得其反的,因为我专门将子对象设置为null,因此EF不会管它。 为什么我不想保存/插入子对象? 由于这