2015-07-21 55 views
0

我有一個問題,不幸的是沒有找到任何反應。如何從第二個數組中的第一個數組中找到對象? Swift iOS

我會用一個簡單的例子來描述這個問題。我有一個對象數組。每個對象都包含id,name,count。該數組是從服務器解析數據的結果。它被視爲第一個。

我也有從另一臺服務器採取第二個數組。這是相同的數組ID,名稱,計數。

我的問題如下。第一個數組有20個元素,然後每個這個元素我想與另一個數組進行比較。第二個數組是解析。您可能需要使用一個循環,並檢查第一個數組中的每個元素是否在第二個中?

// 
// ViewController.swift 
// ParseSearching 
// 
// Created by Mateusz Fraczek on 21.07.2015. 
// Copyright (c) 2015 universeldev. All rights reserved. 
// 

import UIKit 
import Parse 

struct Model : Equatable { 
    var ide: String! 
    var name: String! 
    var count: String! 
} 

func ==(a: Model, b: Model) -> Bool { 
    return a.ide == b.ide && a.name == b.name && a.count == b.count 
} 

extension Array { 

    func indexesOfSubset<T : Equatable>(objects : [T]) -> [Int] { 

     // Create storage for filtered objects and results 
     var unusedObjects = objects 
     var result : [Int] = [] 

     // Enumerate through all objects in array 
     for (index, obj) in enumerate(self) { 

      // Enumerate again through all objects that has not been found 
      for x in unusedObjects { 

       // If we hit match, append result, remove it from usused objects 
       if obj as! T == x { 
        result.append(index) 
        unusedObjects = unusedObjects.filter({ $0 != x }) 
        break 
       } 
      } 
     } 

     // Get results 
     return result 
    } 
} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var firstArray = [Model]() 
     var resultsArray = [Model]() 


     firstArray.append(Model(ide: "xyz1", name: "name1", count: "0")) 
     firstArray.append(Model(ide: "xyz2", name: "name2", count: "0")) 
     firstArray.append(Model(ide: "xyz3", name: "name3", count: "0")) 
     firstArray.append(Model(ide: "xyz4", name: "name4", count: "0")) 

//  let testObject = PFObject(className: "TestObject") 
//  testObject["ide"] = "xyz1" 
//  testObject["name"] = "name1" 
//  testObject["count"] = "0" 
//  testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in 
//   println("Object has been saved.") 
//  } 


     var query = PFQuery(className: "TestObject") 

     query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 
      if let object = objects as? [PFObject] { 
       for obj in object { 
        var id = obj.objectForKey("ide") as! String 
        var name = obj.objectForKey("name") as! String 
        var count = obj.objectForKey("count") as! String 

        var model = Model(ide: id, name: name, count: count) 

        resultsArray.append(model) 
        println(resultsArray) 
        let indexes = firstArray.indexesOfSubset(resultsArray) 

        println("Indexes \(indexes) ") 
       } 
      } 
     } 



    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



} 
+0

是否想通過名稱檢查id的名稱或按count數? – Daljeet

+0

我想在第一個數組中找到第二個數組中的對象。 – Maselko

+0

如果你用一個例子來解釋,我很容易引導你。 – Daljeet

回答

0

爲了找到子集的索引,最好在SWIFT中使用新的東西,你說什麼?因此,讓我們使用泛型,並制定解決方案,在將來您的對象發生變化時,或者您將完全使用不同的對象。讓我們創建擴展您的數組:

extension Array { 

    func indexesOfSubset<T : Equatable>(objects : [T]) -> [Int] { 

     // Create storage for filtered objects and results 
     var unusedObjects = objects 
     var result : [Int] = [] 

     // Enumerate through all objects in array 
     for (index, obj) in enumerate(self) { 

      // Enumerate again through all objects that has not been found 
      for x in unusedObjects { 

       // If we hit match, append result, remove it from usused objects 
       if obj as! T == x { 
        result.append(index) 
        unusedObjects = unusedObjects.filter({ $0 != x }) 
        break 
       } 
      } 
     } 

     // Get results 
     return result 
    } 
} 

現在你可以使用這個方法利用到找對象:

let sameIndexes = allData.indexesOfSubset(fetchedData) 

當然,讀取的數據,所有數據必須是相同的數據類型,你的情況[模型]。你還必須確保你能正確地比較這兩個對象,要做到這一點,你必須創建比較把你的數據類型是這樣的:

public func ==(a: Model, b: Model) -> Bool { 
    return a.id == b.id && a.name == b.name && a.count == b.count 
} 

此外,爲了爲它工作,你必須讓你的對象符合Equatable協議,這樣做的:

struct Model : Equatable { 

現在,當你比較兩個相同的模型對象,你會得到比較== TRUE,而不是一個錯誤:)希望它可以幫助!

編輯: Here is test gist在這裏你可以找到一切,包括自評的東西+如何使用它

+0

Error here: for(index,obj)in enumerate(self) – Maselko

+0

爲了更好的理解,我編輯了我的答案 - 您必須將它作爲數組的擴展:) –

+0

謝謝。但是,我怎樣才能使用它與模型?在我的代碼中,我可以看到無法使用Model類型的參數列表調用indexesOfSubset。 – Maselko

0

我絕不是專家,但我會使用NSarray class內的isEqualToArray。

類中的函數將接收數組與另一個數組進行比較。

SWIFT 
func isEqualToArray(_ otherArray: [AnyObject]) -> Bool 

返回值
YES如果otherArray的內容等於接收陣列的內容,否則NO

1

這是你如何能做到:

夫特1:

var array = ["1", "2", "3"] 
var contained = contains(array, "2") 
println(contained ? "yes" : "no") 

Swift 2:

var array = ["1", "2", "3"] 
var contained = array.contains("2") 
println(contained ? "yes" : "no") 
0

使用過濾器,並且包含

func == (lhs: SomeStruct, rhs: SomeStruct) -> Bool { 
    return lhs.intConstant == rhs.intConstant && lhs.stringConstant == rhs.stringConstant 
} 

struct SomeStruct: Equatable { 
    let intConstant:Int 
    let stringConstant:String 
} 

var someStructOne = SomeStruct(intConstant: 1, stringConstant: "1") 
var someStructTwo = SomeStruct(intConstant: 2, stringConstant: "2") 
var someStructThree = SomeStruct(intConstant: 3, stringConstant: "4") 
var someStructFour = SomeStruct(intConstant: 4, stringConstant: "4") 
var someStructFive = SomeStruct(intConstant: 5, stringConstant: "5") 


let structArrayOne = [someStructOne, someStructTwo, someStructThree] 
let structArrayTwo = [someStructOne, someStructFour, someStructFive] 

let structsInBothArrays = structArrayOne.filter({contains(structArrayTwo, $0)}) 

這裏的竅門是使該結構符合Equatable ptotocol。您可以使用頂部的全局函數定義來做到這一點,該定義給出瞭如何比較兩個結構的定義。

+0

它應該與struct一起工作。 – Maselko

+0

編輯我的示例以使用簡單的結構 –

相關問題