Arrays 如何在Swift中合并两个自定义类型数组并删除重复的自定义类型项?

Arrays 如何在Swift中合并两个自定义类型数组并删除重复的自定义类型项?,arrays,swift,Arrays,Swift,我在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.

我在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将包含所有重复的项

我检查了其他问题,如:
.

然而,在我的例子中,我不能更改Obj的超类NSObject自定义类型必须是NSObject的子类。


问题:有没有什么优雅的方法可以实现合并两个自定义类型数组并删除重复的自定义类型项

我根据@Hamish的评论和


我把它放在set stuff之前的底部。

对于
NSObject
子类,您需要覆盖
isEqual(:)
散列(而不是重载
=
),比较。
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))
  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
  }