首页 > 解决方案 > 来自多个值的唯一数组

问题描述

我有一个具有这种结构的对象数组:

struct Message {
    let name: String
    let fromNumber: String
    let toNumber: String
}

let array = [Message(name: "John", fromNumber: "123456789", toNumber: "987654321")
            ,Message(name: "John", fromNumber: "987654321", toNumber: "123456789")
            ,Message(name: "Smith", fromNumber: "11223344", toNumber: "987654321")
            ,Message(name: "Smith", fromNumber: "987654321", toNumber: "11223344")]

如何对它们进行分组并获得具有唯一值的数组?请注意,name属性不是唯一的。

结果应该是:

[Message(name: "John", fromNumber: "123456789", toNumber: "987654321"),
 Message(name: "Smith", fromNumber: "11223344", toNumber: "987654321")]

标签: swift

解决方案


我的理解是,可能会返回具有相同名称和数字组合的任何消息,因此对于此解决方案,我正在使用Setand Hashable

首先使结构符合Hashable我们将两个数字属性作为一个比较的方式。

extension Message: Hashable {
    static func == (lhs: Message, rhs: Message) -> Bool {
            return lhs.name == rhs.name &&
                Set(arrayLiteral: lhs.fromNumber, lhs.toNumber) == Set(arrayLiteral: rhs.fromNumber, rhs.toNumber)
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
        hasher.combine(Set(arrayLiteral: fromNumber, toNumber))
    }
}

然后使用熟悉的解决方案将数组转换为集合,然后再转换回数组

let unique = Array(Set(array))

推荐阅读