【问题标题】:How to merge two custom type arrays and remove duplicate custom type items in Swift?如何在 Swift 中合并两个自定义类型数组并删除重复的自定义类型项?
【发布时间】:2018-03-13 00:00:37
【问题描述】:

我在 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 的子类。

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

【问题讨论】:

标签: arrays swift


【解决方案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
  }

我把这个放在设置的东西之前的底部。

【讨论】:

    【解决方案2】:

    我已经根据@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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多