iOS Swift 3:比较另一个数组中Array的所有元素

时间:2017-08-03 03:52:24

标签: ios arrays swift

我有像

这样的结构模型
struct ModelA {
    let text: String
    let id: Int
}

extension ModelA: Equatable {}

func ==(lhs: ModelA, rhs: ModelA) -> Bool {
    let areEqual = lhs.id == rhs.id
    return areEqual
}

我创建了这个模型的数组

let a1:[ModelA] = [ModelA(text: "10", id: 11), ModelA(text: "11", id: 12)]
let a2:[ModelA] = [ModelA(text: "11", id: 12)]

并具有比较功能

func isEqualArray(first array1: [Any], second array2: [Any]) -> Bool {
     let set1 = NSSet(array: array1)
     let set2 = NSSet(array: array2)
     return set1.isSubset(of: set2 as! Set<AnyHashable>)
}

所以当我试图交叉检查时

 let flag = isEqualArray(first: a1, second: a2)
 print("### \(flag)")

它在函数返回时崩溃

enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的结构需要符合equatablehashable,才能在Set中使用。您似乎只关心id,因此一个简单的实现将是:

struct ModelA {
    let text: String
    let id: Int
}

extension ModelA: Equatable {
    static func ==(lhs: ModelA, rhs: ModelA) -> Bool {
        return lhs.id == rhs.id
    }
}

extension ModelA: Hashable {
    var hashValue: Int {
        return id
    }
}

现在,您可以在isEqualArray函数中使用Swift集;您还需要考虑使用isSubSet(of:)后哪个集更小:

func isEqualArray(first array1: [AnyHashable], second array2: [AnyHashable]) -> Bool {

    let set1: Set<AnyHashable>
    let set2: Set<AnyHashable>

    if array1.count > array2.count {
        set1 = Set(array1)
        set2 = Set(array2)
    } else {
        set1 = Set(array2)
        set2 = Set(array1)
    }
    return set2.isSubset(of: set1)
}

您的代码实际上确定一个数组是否是另一个数组的子集,而不是数组是否相等,所以我不确定这是否是您想要的。