我在Playgraound中有以下代码,它没有按照我的意愿工作。
class Obj: NSObject {
var va1: String? = nil
var va2: Int? = nil
init(_ v1: String,_ v2: Int){
va1 = v1
va2 = v2
}
static func ==(lhs: Obj, rhs: Obj) -> Bool {
guard lhs.va1 == rhs.va1 else { return false }
guard lhs.va2 == rhs.va2 else { return false }
return true
}
}
var objArray1: [Obj] = [Obj("a", 1), Obj("b", 2), Obj("c", 3)]
var objArray2: [Obj] = [Obj("a", 1), Obj("b", 2), Obj("d", 4)]
objArray1 += objArray2
objArray1 = Array(Set(objArray1))
但是objArray1将包含所有重复的项目。
我检查过其他问题:
Removing Duplicates From Array of Custom Objects Swift。
Remove duplicate objects in an array。
但是,就我而言,我无法改变Obj的超类NSObject。 自定义类型必须是NSObject的子类。
问题:是否有任何优雅的方法来实现合并两个自定义类型数组并删除重复的自定义类型项
答案 0 :(得分:1)
var tempArray: [Obj] = []
let removalArray = objArray1.filter { (someObj) -> Bool in
if tempArray.isEmpty {
tempArray.append(someObj)
return true
}
if !tempArray.contains(where: { (anotherObj) -> Bool in
return anotherObj.va2 == someObj.va2 && anotherObj.va1 == someObj.va1
}) {
tempArray.append(someObj)
return true
}
return false
}
我把它放在设置之前的底部。
答案 1 :(得分:0)
我已根据@Hamish的评论和link解决了这个问题。
class Obj: NSObject {
var va1: String? = nil
var va2: Int? = nil
var value : Int
init(_ v1: String,_ v2: Int){
va1 = v1
va2 = v2
super.init()
}
override var hashValue : Int {
var hashValueString = va1 ?? ""
hashValueString += "\(va2 ?? 0)"
return hashValueString.hashValue
}
override func isEqual(_ object: Any?) -> Bool {
if let other = object as? Obj {
return self.hashValue == other.hashValue
} else {
return false
}
}
}
var objArray1: [Obj] = [Obj("a", 1), Obj("b", 2), Obj("c", 3)]
var objArray2: [Obj] = [Obj("a", 1), Obj("b", 2), Obj("d", 4)]
objArray1 += objArray2
var objSet = Array(Set(objArray1))