尝试使用 NSKeyedArchiver 在 UserDefaults 中保存自定义对象
Trying to save custom object in UserDefaults using NSKeyedArchiver
我想在 userdefault 中保存我的自定义 class 对象。
我正在尝试这样保存它:
class func setModel<T: Hashable>(model: T, key: String) {
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: model)
UserDefaults.standard.set(encodedData, forKey: key)
UserDefaults.standard.synchronize()
}
但应用程序在此方法的第一行崩溃并出现错误:
NSForwarding: warning: object 0x600003944000 of class 'DronesApp_Worker.WorkerProfileResponse' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[DronesApp_Worker.WorkerProfileResponse replacementObjectForKeyedArchiver:]
我的自定义对象 class 如下:
class WorkerProfileResponse: Codable, Hashable, Mappable{
static func == (lhs: WorkerProfileResponse, rhs: WorkerProfileResponse) -> Bool {
return lhs.id == rhs.id
}
override var hash: Int{
return self.id!
}
var id, is_logged_in, last_login, last_active: Int?
var username, email, mobile_number: String?
var categoryName: String?
var userCategories: [SelectedCategory]?
var userSubCategories: [SelectedSubCategory]?
var biometricToken: String?
var accessToken: AccessToken?
var userStatus: UserStatus?
var userProfile: UserProfile?
required init(map: Map) {
}
func mapping(map: Map) {
id <- map["id"]
is_logged_in <- map["is_logged_in"]
last_login <- map["last_login"]
last_active <- map["last_active"]
biometricToken <- map["biometricToken"]
username <- map["username"]
email <- map["email"]
mobile_number <- map["mobile_number"]
accessToken <- map["accessToken"]
userStatus <- map["userStatus"]
userCategories <- map["userCategories"]
userSubCategories <- map["userSubCategories"]
userProfile <- map["userProfile"]
}
}
使用JSONEncoder将数据保存到UserDefaults。虚拟代码:
class YourClassName: Codable {
//Your properties here
func saveInPreference() {
do {
let jsonEncoder = JSONEncoder()
UserDefaults.standard.set(try jsonEncoder.encode(Your object here), forKey: "Write UserDefaultKey here")
UserDefaults.standard.synchronize()
}
catch {
print(error.localizedDescription)
}
}
}
希望对您有所帮助!
@Faraz A. Khan 如果您对上述代码有任何疑问,请发表评论。
错误发生是因为需要 NSObject
的子class。
正如我在 previous question 中提到的那样,要使用 NSKeyedArchiver
,class 必须是 NSObject
的子 class,并且必须采用(并实施) NSCoding
。
再一次:NSKeyedArchiver
(与ObjC相关)与Codable
(与Swift相关)无关。
我想在 userdefault 中保存我的自定义 class 对象。 我正在尝试这样保存它:
class func setModel<T: Hashable>(model: T, key: String) {
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: model)
UserDefaults.standard.set(encodedData, forKey: key)
UserDefaults.standard.synchronize()
}
但应用程序在此方法的第一行崩溃并出现错误:
NSForwarding: warning: object 0x600003944000 of class 'DronesApp_Worker.WorkerProfileResponse' does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selector -[DronesApp_Worker.WorkerProfileResponse replacementObjectForKeyedArchiver:]
我的自定义对象 class 如下:
class WorkerProfileResponse: Codable, Hashable, Mappable{
static func == (lhs: WorkerProfileResponse, rhs: WorkerProfileResponse) -> Bool {
return lhs.id == rhs.id
}
override var hash: Int{
return self.id!
}
var id, is_logged_in, last_login, last_active: Int?
var username, email, mobile_number: String?
var categoryName: String?
var userCategories: [SelectedCategory]?
var userSubCategories: [SelectedSubCategory]?
var biometricToken: String?
var accessToken: AccessToken?
var userStatus: UserStatus?
var userProfile: UserProfile?
required init(map: Map) {
}
func mapping(map: Map) {
id <- map["id"]
is_logged_in <- map["is_logged_in"]
last_login <- map["last_login"]
last_active <- map["last_active"]
biometricToken <- map["biometricToken"]
username <- map["username"]
email <- map["email"]
mobile_number <- map["mobile_number"]
accessToken <- map["accessToken"]
userStatus <- map["userStatus"]
userCategories <- map["userCategories"]
userSubCategories <- map["userSubCategories"]
userProfile <- map["userProfile"]
}
}
使用JSONEncoder将数据保存到UserDefaults。虚拟代码:
class YourClassName: Codable {
//Your properties here
func saveInPreference() {
do {
let jsonEncoder = JSONEncoder()
UserDefaults.standard.set(try jsonEncoder.encode(Your object here), forKey: "Write UserDefaultKey here")
UserDefaults.standard.synchronize()
}
catch {
print(error.localizedDescription)
}
}
}
希望对您有所帮助!
@Faraz A. Khan 如果您对上述代码有任何疑问,请发表评论。
错误发生是因为需要 NSObject
的子class。
正如我在 previous question 中提到的那样,要使用 NSKeyedArchiver
,class 必须是 NSObject
的子 class,并且必须采用(并实施) NSCoding
。
再一次:NSKeyedArchiver
(与ObjC相关)与Codable
(与Swift相关)无关。