一尘不染

无法解码类的对象

swift

我正在尝试向我的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")
    }
}

阅读 213

收藏
2020-07-07

共1个答案

一尘不染

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

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

两种修复:

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

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

2020-07-07