编码自定义对象的 nsarray 时无法使用 Hashable
Can't use Hashable while encoding nsarray of custom objects
我有一个自定义 class 用于映射,如下所示。
class UserSaved {
var Id : String
var UserName : String
var profileURL : String
var fullNameUser : String
func encode(with aCoder: NSCoder) {
aCoder.encode(self.Id, forKey: "Id")
aCoder.encode(self.UserName, forKey: "UserName")
aCoder.encode(self.profileURL, forKey: "profileURL")
aCoder.encode(self.fullNameUser, forKey: "fullNameUser")
}
required init?(coder aDecoder: NSCoder) {
self.Id = aDecoder.decodeObject(forKey: "Id") as! String
self.UserName = aDecoder.decodeObject(forKey: "UserName") as! String
self.profileURL = aDecoder.decodeObject(forKey: "profileURL") as! String
self.fullNameUser = aDecoder.decodeObject(forKey: "fullNameUser") as! String
// self.init(my_id: self.Id, my_username: self.UserName, profile_url: self.profileURL, full_name: self.fullNameUser)
}
init(my_id: String, my_username: String, profile_url: String, full_name : String) {
self.Id = my_id
self.UserName = my_username
self.profileURL = profile_url
self.fullNameUser = full_name
}
}
现在我将不同的模型对象添加到两个不同的数组中,如下所示,两个数组下面可能有一些共同的条目
//////array 1
let arrayTemp = dic.value(forKey: "data") as! NSArray
for i in 0..<arrayTemp.count {
let dic = arrayTemp.object(at: i) as! NSDictionary
let strId = String(dic.value(forKey: "pk") as! Int)
let instaName = dic.value(forKey: "username") as! String
let profileURL = dic.value(forKey: "profile_pic_url") as! String
let fullName = dic.value(forKey: "full_name") as! String
let person1 = UserSaved(insta_id: strId, insta_username: instaName,profile_url: profileURL,full_name: fullName)
self.arr1.append(person1)
}
//////array 2
let arrayTemp = dic.value(forKey: "data") as! NSArray
for i in 0..<arrayTemp.count {
let dic = arrayTemp.object(at: i) as! NSDictionary
let strId = String(dic.value(forKey: "pk") as! Int)
let instaName = dic.value(forKey: "username") as! String
let profileURL = dic.value(forKey: "profile_pic_url") as! String
let fullName = dic.value(forKey: "full_name") as! String
let person2 = UserSaved(insta_id: strId, insta_username: instaName,profile_url: profileURL,full_name: fullName)
self.arr2.append(person2)
}
现在我正在使用下面的代码对上面的数组进行操作,效果很好
let setA = Set(self.arr1)
let setB = Set(self.arr2)
let inBothAAndB = setA.intersection(setB)
let inAButNotB = setA.subtracting(setB)
let inBButNotA = setB.subtracting(setA)
现在,当我尝试使用 NSKeyedArchiver.archivedData
将数组保存到 userdefaults 时。它给我如下错误
2018-10-09 12:27:46.375587+0530 Insta_Analytics[12764:181604] *** NSForwarding: warning: object 0x6100000f0500 of class
'Insta_Analytics.UserSaved' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[Insta_Analytics.UserSaved replacementObjectForKeyedArchiver:]
2018-10-09 12:27:46.376141+0530 Insta_Analytics[12764:181604]
Unrecognized selector -[Insta_Analytics.UserSaved replacementObjectForKeyedArchiver:]
这是我将数组保存到 userdefaults
中的代码
let encodedData = NSKeyedArchiver.archivedData(withRootObject: self.arr1)
UserDefaults.standard.set(encodedData, forKey: "arr_store")
现在,如果我更改我的自定义映射模型 UserSaved
继承自 NSCoding
和 NSObject
。可以,但是那个时候操作数据不行
所以一次只有一件事有效。我想使用 NSCoding
保存我的数组,同时 intersection
和 subtracting
应该工作
要使用 NSCoder
,class 必须是 NSObject
的子class
class UserSaved : NSObject, NSCoding {
但在你的情况下,我建议使用 Codable
并将一致性添加到 Equatable
class UserSaved : Codable, Equatable {
删除init(coder
和encode(with
方法并序列化数据
let encodedData = PropertyListEncoder().encode(self.arr1)
并且不要在 Swift 中使用 NSArray / NSDictionary
。使用本机类型。并且不要使用 value(forKey
。使用键下标。
解码数据使用
if let data = UserDefaults.standard.data(forKey: "arr_store") {
do {
let array = try PropertyListDecoder().decode([UserSaved].self, from: data)
} catch { print(error) }
}
更新您的 class UserSaved 以实施以下内容:
class UserSaved: NSObject, NSCoding, Hashable {
// ...
我有一个自定义 class 用于映射,如下所示。
class UserSaved {
var Id : String
var UserName : String
var profileURL : String
var fullNameUser : String
func encode(with aCoder: NSCoder) {
aCoder.encode(self.Id, forKey: "Id")
aCoder.encode(self.UserName, forKey: "UserName")
aCoder.encode(self.profileURL, forKey: "profileURL")
aCoder.encode(self.fullNameUser, forKey: "fullNameUser")
}
required init?(coder aDecoder: NSCoder) {
self.Id = aDecoder.decodeObject(forKey: "Id") as! String
self.UserName = aDecoder.decodeObject(forKey: "UserName") as! String
self.profileURL = aDecoder.decodeObject(forKey: "profileURL") as! String
self.fullNameUser = aDecoder.decodeObject(forKey: "fullNameUser") as! String
// self.init(my_id: self.Id, my_username: self.UserName, profile_url: self.profileURL, full_name: self.fullNameUser)
}
init(my_id: String, my_username: String, profile_url: String, full_name : String) {
self.Id = my_id
self.UserName = my_username
self.profileURL = profile_url
self.fullNameUser = full_name
}
}
现在我将不同的模型对象添加到两个不同的数组中,如下所示,两个数组下面可能有一些共同的条目
//////array 1
let arrayTemp = dic.value(forKey: "data") as! NSArray
for i in 0..<arrayTemp.count {
let dic = arrayTemp.object(at: i) as! NSDictionary
let strId = String(dic.value(forKey: "pk") as! Int)
let instaName = dic.value(forKey: "username") as! String
let profileURL = dic.value(forKey: "profile_pic_url") as! String
let fullName = dic.value(forKey: "full_name") as! String
let person1 = UserSaved(insta_id: strId, insta_username: instaName,profile_url: profileURL,full_name: fullName)
self.arr1.append(person1)
}
//////array 2
let arrayTemp = dic.value(forKey: "data") as! NSArray
for i in 0..<arrayTemp.count {
let dic = arrayTemp.object(at: i) as! NSDictionary
let strId = String(dic.value(forKey: "pk") as! Int)
let instaName = dic.value(forKey: "username") as! String
let profileURL = dic.value(forKey: "profile_pic_url") as! String
let fullName = dic.value(forKey: "full_name") as! String
let person2 = UserSaved(insta_id: strId, insta_username: instaName,profile_url: profileURL,full_name: fullName)
self.arr2.append(person2)
}
现在我正在使用下面的代码对上面的数组进行操作,效果很好
let setA = Set(self.arr1)
let setB = Set(self.arr2)
let inBothAAndB = setA.intersection(setB)
let inAButNotB = setA.subtracting(setB)
let inBButNotA = setB.subtracting(setA)
现在,当我尝试使用 NSKeyedArchiver.archivedData
将数组保存到 userdefaults 时。它给我如下错误
2018-10-09 12:27:46.375587+0530 Insta_Analytics[12764:181604] *** NSForwarding: warning: object 0x6100000f0500 of class
'Insta_Analytics.UserSaved' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[Insta_Analytics.UserSaved replacementObjectForKeyedArchiver:]
2018-10-09 12:27:46.376141+0530 Insta_Analytics[12764:181604]
Unrecognized selector -[Insta_Analytics.UserSaved replacementObjectForKeyedArchiver:]
这是我将数组保存到 userdefaults
let encodedData = NSKeyedArchiver.archivedData(withRootObject: self.arr1)
UserDefaults.standard.set(encodedData, forKey: "arr_store")
现在,如果我更改我的自定义映射模型 UserSaved
继承自 NSCoding
和 NSObject
。可以,但是那个时候操作数据不行
所以一次只有一件事有效。我想使用 NSCoding
保存我的数组,同时 intersection
和 subtracting
应该工作
要使用 NSCoder
,class 必须是 NSObject
class UserSaved : NSObject, NSCoding {
但在你的情况下,我建议使用 Codable
并将一致性添加到 Equatable
class UserSaved : Codable, Equatable {
删除init(coder
和encode(with
方法并序列化数据
let encodedData = PropertyListEncoder().encode(self.arr1)
并且不要在 Swift 中使用 NSArray / NSDictionary
。使用本机类型。并且不要使用 value(forKey
。使用键下标。
解码数据使用
if let data = UserDefaults.standard.data(forKey: "arr_store") {
do {
let array = try PropertyListDecoder().decode([UserSaved].self, from: data)
} catch { print(error) }
}
更新您的 class UserSaved 以实施以下内容:
class UserSaved: NSObject, NSCoding, Hashable {
// ...