2017-01-01 10 views
0

構造体から構築された2つのデータ配列を比較するという考え方で私は演奏していました。この背後に潜在的な考え方は、ローカルデータからの配列とネットワークデータからの配列を比較し、それらが同じである場合は、ローカルデータを使用して、特にデータの一部が画像になる場合に時間を節約しようとしました。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") 
     } 


    } 


} 

----------------- EDIT --------------------

感謝ソリューションWERUreoのために。

私は、それが機能するようにするためには、同等の部分を構造体の拡張部分に移動しなければなりませんでした。私はあなたが表示されている方法がうまくいくと確信しています、私はちょうどそれがエラーなしで起こることができませんでした。

これは配列を比較しているだけですが、問題は今では配列が完全には私が比較コードを実行している時にはデータがバックグラウンドで取得されていないことです。任意のアイデアどのように比較するコードを実行する前に、配列が移入されるのを待つか?メインクラス内の

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 
} 
+1

そのコードはコンパイルされていますか?そうであれば、私たちは写真の一部を欠いているように感じる。それぞれ異なる2つのタイプを持つ2つの異なる配列を比較しようとしています。それは、バットからすぐに失敗するはずです... – WERUreo

+0

ハハはありません。 – Pippo

答えて

2

まず、2つの別個の構造体を定義する必要はありません。 1つの構造体はネットワークとローカルの両方で動作します。また、構造体をEquatableプロトコルに準拠させたいとします。 Equatableには、必要な機能が1つあります。これは==の演算子です。そして、あなたがpackStructの二つの配列を比較することができるはず

:だからあなたの構造体のために、あなたはおそらくのような何かをしたいです。

1

あなたは、異なるタイプの配列のための平等を定義する必要があります。以下のコードは私のために働く。

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 { 

} 
関連する問題