NSKeyedUnarchiver unarchiveObjectWithData:data返回非nil对象,但具有nil属性

时间:2019-11-01 09:50:32

标签: ios objective-c swift iphone

我建立了一个包含一些模型类的快速框架,并且我在另一个ObjC应用程序中使用该框架没有任何问题。该应用使用NSKeyedArchiver/NSKeyedUnarchiver来存储/检索NSUserDefaults中的数据对象:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myCustomer];
[self.prefs setObject:data forKey:@"mykey"];

其中myCustomer是框架中一个快速类的对象。要检索存储的对象,我要做:

NSData *data = [self.prefs dataForKey:@"mykey"];
Customer *myCustomer = [NSKeyedUnarchiver unarchiveObjectWithData:data];

swift类如下:

@objc public class Customer: NSObject, Codable {
    @objc public var customerID: String
    @objc public var email: String?
}

问题在于,在最近更新了swift框架(我对其他一些类(而不是Customer)进行了一些更改)之后,从myCustomer检索到的unarchiveObjectWithData的所有属性都是nil对象本身不是nil,但是其所有属性都是nil myCustomer.email为零,myCustomer.customerID为零。当我切换回旧版本的框架时,上面的代码可以正常工作。

过去几天一直在尝试各种方法,但没有任何效果。该应用程序的最低部署是iOS 12,该框架是使用swift 5.0编写的。非常感谢任何提示,想法或答案。

2 个答案:

答案 0 :(得分:1)

CodableNSCoding不同。要将Codable对象编码为plist文件,您需要使用PropertyListEncoder。如果您需要JSON数据,请使用JSONEncoder。要使您的对象符合NSCoding,您可以选中此post

答案 1 :(得分:-1)

只是一个假设:声明Swift vars动态是否有帮助? (请参见What does @objc dynamic var mean in Swift 4

相关问题