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

无法解码类的对象

牛嘉谊
2023-03-14
问题内容

我正在尝试向我的Watchkit扩展发送“类”,但出现此错误。

由于未捕获的异常’NSInvalidUnarchiveOperationException’而终止应用程序,原因:’
-[NSKeyedUnarchiver encodeObjectForKey:]:无法解码类(MyApp.Person)的对象

存档和取消存档在iOS App上运行良好,但在与watchkit扩展进行通信时无法正常工作。怎么了?

InterfaceController.swift

    let userInfo = ["method":"getData"]

    WKInterfaceController.openParentApplication(userInfo,
        reply: { (userInfo:[NSObject : AnyObject]!, error: NSError!) -> Void in

            println(userInfo["data"]) // prints <62706c69 7374303...

            if let data = userInfo["data"] as? NSData {
                if let person = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Person {
                    println(person.name)
                }
            }

    })

AppDelegate.swift

func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!,
    reply: (([NSObject : AnyObject]!) -> Void)!) {

        var bob = Person()
        bob.name = "Bob"
        bob.age = 25

        reply(["data" : NSKeyedArchiver.archivedDataWithRootObject(bob)])
        return
}

人智

class Person : NSObject, NSCoding {
    var name: String!
    var age: Int!

    // MARK: NSCoding

    required convenience init(coder decoder: NSCoder) {
        self.init()
        self.name = decoder.decodeObjectForKey("name") as! String?
        self.age = decoder.decodeIntegerForKey("age")
    }

    func encodeWithCoder(coder: NSCoder) {
        coder.encodeObject(self.name, forKey: "name")
        coder.encodeInt(Int32(self.age), forKey: "age")
    }
}

问题答案:

注: 虽然这个答案的信息是正确的, 方法 更好的答案是低于@agy之一。

这是由编译器在同一类中创建MyApp.Person&引起的MyAppWatchKitExtension.Person。这通常是由于在两个目标之间共享同一类
而不是 创建一个框架来共享而引起的。

两种修复:

正确的解决方法是提取Person到框架中。主应用程序和watchkit扩展都应使用该框架,并且将使用同一*.Person类。

解决方法是NSDictionary在保存并传递类之前将您的类序列化为Foundation对象(如)。在NSDictionary将代码与跨解码应用和扩展两者。做到这一点的一个好方法是改为实施RawRepresentable协议Person



 类似资料:
  • 问题内容: 我在JSON方面遇到问题,我似乎无法弄清为什么它不起作用。这应该输出JSON。 这是我的代码 我收到这个错误 如果有人可以救援,那就太好了! 问题答案: 看来您的JSON无效。在这种情况下,这完全取决于服务器发送给您的数据(您未显示)。我建议通过JSON验证程序运行响应。

  • 我有一个json转储为 我编写了一个小代码来从json获取一些详细信息 这给我造成了错误: 回溯(最近一次调用):文件“python_opennms.py”,第24行,in x=get_nodes_opennms()文件“python_opennms.py”,第15行,in get_nodes_opennms for i in JSON.load(open('out.txt'))[“alarm”]

  • 问题内容: 我的文件在第一行都有编码定义器,就像我的 正如我在相关问题上提到的那样,我用来返回api文档。由于我通过以下方式定义编码: 一切正常,当我调用我的API服务时,除了 由pprint由字典形成的字符串 外 , 没有任何编码问题 __ 由于我在字典中的某些值中使用土耳其语字符,因此pprint将其转换为等效的字符,例如: 我的纯文本输出如下: 我尝试将pprint输出解码或编码为不同的编码

  • 相反,马文没有做到这一点。。 …在项目中的每个类类型上(不仅仅是上面提到的)。 如何将IntelliJ配置为成功? [与此类似,但不完全相同的问题(尽管可能有帮助)]: 为什么这么红?IntelliJ似乎认为每个声明/方法都无法找到/解决 听起来像是[错误?]的措辞,“导入时无法解析符号”与我的类似,但不同(“无法解析java.lang.Object类型。它是从必需的.class文件中间接引用的”

  • 我已经部署了一个CloudFirebase函数来更新一些聚合数据,但是我得到了 聚合收据评级:错误:无法从文件快照中的消防恢复值解码类型:{“integerValue”:“3”}。_decodeValue(/user_code/node_modules/Firebase-admin/node_modules/@google-Cloud/消防恢复/src/document.js:464: 15)在D

  • 我的主要问题是我得到一个错误,说明:在第80行: 第80行是