我有像
这样的结构模型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)")
它在函数返回时崩溃
我做错了什么?
答案 0 :(得分:1)
您的结构需要符合equatable
和hashable
,才能在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)
}
您的代码实际上确定一个数组是否是另一个数组的子集,而不是数组是否相等,所以我不确定这是否是您想要的。