Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Swift 3:比较一个数组中的所有元素_Ios_Arrays_Swift - Fatal编程技术网

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)
}