我建立了一个包含一些模型类的快速框架,并且我在另一个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编写的。非常感谢任何提示,想法或答案。
答案 0 :(得分:1)
Codable
与NSCoding
不同。要将Codable
对象编码为plist文件,您需要使用PropertyListEncoder
。如果您需要JSON数据,请使用JSONEncoder。要使您的对象符合NSCoding,您可以选中此post
答案 1 :(得分:-1)
只是一个假设:声明Swift vars动态是否有帮助? (请参见What does @objc dynamic var mean in Swift 4)