2015-07-21 18 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

编辑我的示例以使用简单的结构 –

相关问题