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

时间:2018-03-13 00:00:38

标签: 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.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的子类。

问题:是否有任何优雅的方法来实现合并两个自定义类型数组并删除重复的自定义类型项

2 个答案:

答案 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))