arrays - 编码自定义对象的 nsarray 时无法使用 Hashable

标签 arrays swift nsobject nscoding hashable

我有一个自定义的映射类,如下所示。

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 继承自 NSCodingNSObject。它可以工作,但是那个时候操作数据是行不通的

所以一次,只有一件事有效。我想使用 NSCoding 保存我的数组,同时 intersectionsubtracting 应该可以工作

最佳答案

要使用 NSCoder 类必须是 NSObject 的子类

class UserSaved : NSObject, NSCoding {

但在您的情况下,我建议使用 Codable 并将一致性添加到 Equatable

class UserSaved : Codable, Equatable {

删除init(coderencode(with方法并序列化数据

let encodedData = PropertyListEncoder().encode(self.arr1)

并且不要在 Swift 中使用 NSArray/NSDictionary。使用 native 类型。并且不要使用 value(forKey。使用键下标。

解码数据使用

if let data = UserDefaults.standard.data(forKey: "arr_store") {
    do {
        let array = try PropertyListDecoder().decode([UserSaved].self, from: data)

    } catch { print(error) }
}

关于arrays - 编码自定义对象的 nsarray 时无法使用 Hashable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52715394/

相关文章:

ios - 为什么我会收到此错误 : fatal error - array index out of range?

javascript - Lodash 从另一个对象追加对象而不进行替换

ios - 如何返回此函数的结果?

swift - 使用 Swift (macOS) 从图像制作 GIF

包含 NSObject 子类时,Swift 2.0 Set 无法按预期工作

swift - 在 Swift 中使用 NSObject 类的目的是什么?

swift - 无法将 NSButton 添加到 Sprite-Kit 场景

c# 一种将多个数组复制/合并到一个数组中的更好方法

c - 如何读取单个文件中字符串的最后 n 个字符?

ios - CGContext & CGMutablePath 画线 但它是相反的