[英]Storing data in UserDefaults
I'm trying to save User details in UserDefaults
using below method but it crashes on archiver.encode(assistantContact,forKey: "assistantContact")
. 我正在尝试使用以下方法将用户详细信息保存在UserDefaults
中,但是在archiver.encode(assistantContact,forKey: "assistantContact")
上崩溃。 I tried making AssistantContact as class instead of Struct but still it didn't worked. 我尝试将AssistantContact设置为类而不是Struct,但仍然没有用。 How to archive AssistantContact too in order to save them in User? 如何也将AssistantContact存档以将其保存在User中? ? ?
struct AssistantContact {
var firstName: String
var lastName: String
var email: [String]
}
struct User {
var firstName: String
var lastName: String
var email: String
var phoneNumber: String
var company: String
var assistantContact: AssistantContact
}
extension User {
func encode() -> Data {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(firstName, forKey: "firstName")
archiver.encode(lastName, forKey: "lastName")
archiver.encode(email, forKey: "email")
archiver.encode(phoneNumber, forKey: "phoneNumber")
archiver.encode(company, forKey: "company")
archiver.encode(assistantContact, forKey: "assistantContact")
archiver.finishEncoding()
return data as Data
}
init?(data: Data) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
defer {
unarchiver.finishDecoding()
}
guard let firstName = unarchiver.decodeObject(forKey: "firstName") as? String else { return nil }
guard let lastName = unarchiver.decodeObject(forKey: "lastName") as? String else { return nil }
guard let email = unarchiver.decodeObject(forKey: "email") as? String else { return nil }
guard let phoneNumber = unarchiver.decodeObject(forKey: "phoneNumber") as? String else { return nil }
guard let company = unarchiver.decodeObject(forKey: "company") as? String else { return nil }
guard let assistantContact = unarchiver.decodeObject(forKey: "assistantContact") as? AssistantContact else { return nil }
self.firstName = firstName
self.lastName = lastName
self.email = email
self.phoneNumber = phoneNumber
self.company = company
self.assistantContact = assistantContact
}
}
You can store the values in a NSObject
and then use this method for archiving data. 您可以将值存储在NSObject
,然后使用此方法来归档数据。 Replace the archiver.encode(assistantContact, forKey: "assistantContact")
with archiver.archivedData(withRootObject: assistantContact)
将archiver.encode(assistantContact, forKey: "assistantContact")
替换为archiver.archivedData(withRootObject: assistantContact)
and use this for unarchive unarchiver.unarchiveObject(with: assistantContact)
并将其用于取消存档unarchiver.unarchiveObject(with: assistantContact)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.