删除结构数组中的重复项

JLa*_*ers 0 swift

我正在过滤一个数组,该数组可以具有一个值,其中有多个具有相同名称的模型,只是它们具有不同的模型编号。

变数

var modelArray = [model]()
Run Code Online (Sandbox Code Playgroud)

结构

struct model {
    var modelName = String();
    var modelNumber = String();
    var manufacturer = String();
    var phiTypeCode = String();
    var phiTypeDesc = String();
}
Run Code Online (Sandbox Code Playgroud)

过滤

var filteredArray = self.modelArray.filter { $0.manufacturer.range(of: manufacturerVar, options: .caseInsensitive) != nil }
Run Code Online (Sandbox Code Playgroud)

仅由于存在具有不同型号的相似型号的可能性,这会产生正确的过滤Array,我正尝试从中删除重复项filteredArray。相当新,我没有太多的经验可以使结构可哈希化以使用建议的解决方案。

希望这更清楚

Gle*_*enn 5

首先,我尝试在PlayGround中制作样本。

  1. 使模型符合model协议Equatable,如下所示:

    struct Car: Equatable {
    
        var modelName = String()
        var manufacturer = String()
    
        init(modelName: String, manufacturer: String) {
            self.modelName = modelName
            self.manufacturer = manufacturer
        }
    
        static func == (lhs: Car, rhs: Car) -> Bool {
            return lhs.modelName == rhs.modelName
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们假设the modelName是模型的主键。

  1. 现在创建一个枚举数据源并在逐一检查元素后返回新数据源的函数,如下所示:

    // returns unique array
    
    func unique(cars: [Car]) -> [Car] {
    
        var uniqueCars = [Car]()
    
        for car in cars {
            if !uniqueCars.contains(car) {
                uniqueCars.append(car)
            }
        }
    
        return uniqueCars
    }
    
    Run Code Online (Sandbox Code Playgroud)

最后,您现在具有生成新的唯一数据源的功能。

例:

// Variable

var cars = [Car]()

// Adding data models to data source

let car1 = Car(modelName: "Kia Picanto", manufacturer: "Kia")
let car2 = Car(modelName: "Honda XX", manufacturer: "Honda")
let car3 = Car(modelName: "Honda XX", manufacturer: "Honda")

cars.append(car1)
cars.append(car2)
cars.append(car3)

// Now contains only two elements.
let uniqueCars = unique(cars: cars)
Run Code Online (Sandbox Code Playgroud)