iOS:自定义对象';s int变量在NSUserDefaults中返回nil
我有个奇怪的问题。我将自定义类对象保存在iOS:自定义对象';s int变量在NSUserDefaults中返回nil,ios,swift,nsuserdefaults,custom-object,Ios,Swift,Nsuserdefaults,Custom Object,我有个奇怪的问题。我将自定义类对象保存在NSUserDefaults中,在检索对象的int变量的nil数据时。下面是自定义类 class User { var name: String? var user_id: Int? var account_id: Int? var location: String? } 我将对象保存为 let defaults = NSUserDefaults.standardUserDefaults() var data = NSKe
NSUserDefaults
中,在检索对象的int
变量的nil
数据时。下面是自定义类
class User {
var name: String?
var user_id: Int?
var account_id: Int?
var location: String?
}
我将对象保存为
let defaults = NSUserDefaults.standardUserDefaults()
var data = NSKeyedArchiver.archivedDataWithRootObject([user]) // I can see the int values for the user objects here
defaults.setObject(data, forKey: "all_users")
将数据检索为
let defaults = NSUserDefaults.standardUserDefaults()
let data = defaults.dataForKey("all_users")
var users = [Users]()
if data != nil {
let userData = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! [Users]
for usr in userData {
print("\(usr.name!)") // Prints the name
print("\(usr.user_id!)") // Nil value here
users.append(usr)
}
}
我完全不知道这种行为的原因。没有属性列表项的自定义类需要符合NSCoding才能保存在NSUserDefaults中 以下是遵守NSCoding的指南: 您将需要这两个功能:
init(coder decoder: NSCoder) {
self.name = decoder.decodeObjectForKey("name") as String
self.user_id = decoder.decodeIntegerForKey("user_id")
self.account_id = decoder.decodeIntegerForKey("account_id")
self.location = decoder.decodeObjectForKey("self.location") as String
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeInt(self.user_id, forKey: "user_id")
coder.encodeInt(account_id, forKey: "account_id")
coder.encodeObject(self.location, forKey: "location")
}
没有属性列表项的自定义类需要符合NSCoding才能保存在NSUserDefaults中 以下是遵守NSCoding的指南: 您将需要这两个功能:
init(coder decoder: NSCoder) {
self.name = decoder.decodeObjectForKey("name") as String
self.user_id = decoder.decodeIntegerForKey("user_id")
self.account_id = decoder.decodeIntegerForKey("account_id")
self.location = decoder.decodeObjectForKey("self.location") as String
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeInt(self.user_id, forKey: "user_id")
coder.encodeInt(account_id, forKey: "account_id")
coder.encodeObject(self.location, forKey: "location")
}
您的类需要符合
NSCoding
您可能需要编写自己的Archiver
@Putz1103我已经看到了这个解决方案,但是在你指出它之前我没有尝试过。它起作用了。谢谢您的类需要符合NSCoding
您可能需要编写自己的Archiver
@Putz1103我已经看到了这个解决方案,但是在你指出它之前我没有尝试过。它起作用了。谢谢