【问题标题】:Compare 2 struct Arrays比较 2 个结构数组
【发布时间】:2017-01-01 23:53:48
【问题描述】:

我正在考虑比较 2 个数据数组,每个数组都是由一个结构构建的。这背后的潜在想法是将来自本地数据的数组与来自网络数据的数组进行比较,如果它们相同,则使用本地数据来尝试节省时间,尤其是当某些数据是图像时。

我为测试而模拟的基本代码如下,但是我似乎无法比较数组,因为它们来自结构?有没有办法解决这个问题?

func compareQuery() {

    struct packStructNW {
        var packName : String
        var packDescription : String
        var packTitle : String
        var packImage : PFFile
        var packID: String
    }

    var packArrayNW = [packStructNW]()

    struct packStructLDS {
        var packName : String
        var packDescription : String
        var packTitle : String
        var packImage : PFFile
        var packID: String
    }

    var packArrayLDS = [packStructLDS]()

    if self.connected {
        let packQueryNW = PFQuery(className: "Pack")
            packQueryNW.order(byAscending: "packName")
            packQueryNW.findObjectsInBackground(block: { (objectsArray, error) in
                if error != nil {
                    print(error!)
                } else {
                    if let packs = objectsArray {
                        for object in packs {
                            let arrayName = object.object(forKey: "packName") as! String
                            let arrayDescription = object.object(forKey: "packDescription") as! String
                            let arrayTitle = object.object(forKey: "packTitle") as! String
                            let arrayImage = object.object(forKey: "packImage") as! PFFile
                            let arrayID = object.objectId as String!
                            packArrayNW.append(packStructNW(packName: arrayName, packDescription: arrayDescription, packTitle: arrayTitle, packImage: arrayImage, packID: arrayID!))

                        }
                    }
                }
            })

        let packQueryLDS = PFQuery(className: "Pack")
        packQueryLDS.order(byAscending: "packName")
        packQueryLDS.fromLocalDatastore()
        packQueryLDS.findObjectsInBackground(block: { (objectsArray, error) in
            if error != nil {
                print(error!)
            } else {
                if let packs = objectsArray {
                    for object in packs {
                        let arrayName = object.object(forKey: "packName") as! String
                        let arrayDescription = object.object(forKey: "packDescription") as! String
                        let arrayTitle = object.object(forKey: "packTitle") as! String
                        let arrayImage = object.object(forKey: "packImage") as! PFFile
                        let arrayID = object.objectId as String!
                        packArrayLDS.append(packStructLDS(packName: arrayName, packDescription: arrayDescription, packTitle: arrayTitle, packImage: arrayImage, packID: arrayID!))

                    }
                }
            }
        })

        print(packArrayNW)

        print(packArrayLDS)

        if packArrayLDS == packArrayNW {
            print("they are the same")
        } else {
            print("they are different")
        }


    }


}

----------------- 编辑 --------------------

感谢 WERReo 的解决方案。

最后,我不得不将可等式部分移动到结构的扩展中以使其工作。我确定您展示的方式确实有效,但我无法做到没有错误。

它比较数组,我现在唯一的问题是,当我在后台获取数据时,当我运行比较代码时,数组并没有完全填充。知道如何在运行代码进行比较之前等待填充数组吗?

在主类中

struct myStruct {
    var packName : String
    var packDescription : String
    var packTitle : String
    var packImage : PFFile
    var packID: String
}

主课外

extension PackViewController.myStruct: Equatable {}

func ==(lhs: PackViewController.myStruct, rhs: PackViewController.myStruct) -> Bool {
    let areEqual = lhs.packName == rhs.packName &&
                    lhs.packDescription == rhs.packDescription &&
                    lhs.packTitle == rhs.packTitle &&
                    lhs.packImage === rhs.packImage &&
                    lhs.packID == rhs.packID
    return areEqual
}

【问题讨论】:

  • 那段代码还能编译吗?如果是这样,我觉得我们缺少了图片的一部分。您正在尝试比较两个不同的数组,每个数组都包含两种不同的类型。那应该马上就失败了……
  • 哈哈不,它没有。

标签: ios arrays swift struct


【解决方案1】:

首先,您不需要定义两个单独的结构。一种结构适用于网络和本地。您还希望使结构符合Equatable 协议。 Equatable 有一个必需的函数,即== 运算符。因此,对于您的结构,您可能会执行以下操作:

struct packStruct: Equatable {
    var packName : String
    var packDescription : String
    var packTitle : String
    var packImage : PFFile
    var packID: String

    static func ==(lhs: packStruct, rhs: packStruct) -> Bool {
        return lhs.packName == rhs.packName &&
               lhs.packDescription == rhs.packDescription &&
               lhs.packTitle == rhs.packTitle &&
               lhs.packImage == rhs.packImage && // you need to make sure PFFile is also Equatable
               lhs.packID == rhs.packID
    }
}

那么你应该可以比较packStruct的两个数组了。

【讨论】:

    【解决方案2】:

    您必须为不同类型的数组定义相等性。下面的代码对我有用。

    func ==(lhs: [packStructNW], rhs: [packStructLDS]) -> Bool {
       ...
    }
    
    func ==(lhs: [packStructNW], rhs: [packStructNW]) -> Bool {
        ...
    }
    
    func ==(lhs: [packStructLDS], rhs: [packStructNW]) -> Bool {
        ...
    }
    
    func ==(lhs: [packStructLDS], rhs: [packStructLDS]) -> Bool {
        ...
    }
    
    struct packStructNW {}
    
    struct packStructLDS {}
    
    var packArrayNW = [packStructNW]()
    var packArrayLDS = [packStructLDS]()
    
    if packArrayNW == packArrayLDS {
    
    } else {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-13
      • 2015-11-12
      • 2011-08-17
      • 2016-03-29
      • 2011-12-01
      • 2013-05-25
      • 1970-01-01
      • 2022-01-11
      • 2011-11-24
      相关资源
      最近更新 更多