iOS Swift 3:比较一个数组中的所有元素
我有一个类似的结构模型iOS Swift 3:比较一个数组中的所有元素,ios,arrays,swift,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
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>)
}
它在函数返回时崩溃
我做错了什么?您的结构需要同时符合
equalable
和hashable
,才能在集中使用。您似乎只关心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集合;您还需要考虑哪一组较小,因为您使用的是<代码>子集(of:):/> >:
func isEqualArray(第一个数组1:[AnyHashable],第二个数组2:[AnyHashable])->Bool{
让set1:Set
让我们设定2:设定
如果array1.count>array2.count{
set1=Set(阵列1)
set2=Set(阵列2)
}否则{
set1=Set(阵列2)
set2=Set(阵列1)
}
return set2.isSubset(of:set1)
}
您的代码实际上确定了一个数组是否是另一个数组的子集,而不是数组是否相等,因此我不确定这是否是您想要的。您的结构需要符合哈希表
以及相等表
我也尝试过,但仍然相同。为什么要使用NSSet
而不是Swift集?你什么时候用都可以!如果向下播放失败,你要求你的代码崩溃。你能回答任何代码吗?这样我就可以试一下。正如我说的,你的代码使用的是isSubSet(Of:)
,所以你需要知道哪个数组更大,一个更大的集合不能是一个较小的集合的子集。这是我需要的完整答案
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
}
}
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)
}