在dict数组中查找dict的索引

时间:2015-10-11 03:30:57

标签: ios swift

为什么我找不到字典数组中字典的索引?我知道每个字典的键值对都是无序的,但是数组数组中的顺序应该是有序的,因此我应该能够找到索引。

例如:

var dict = [String:AnyObject]()
var array = [[String:AnyObject]]()

dict["name"] = "John" as? AnyObject
dict["city"] = "New York" as? AnyObject
array.append(dict)

for dict in array {

   if let index = find(array, dict) {

       // do something

   }

}

我无法执行find(array, dict)功能。 Cannot invoke 'find' with an argument list of type '([([String:AnyObject])]), Dictionary<String,AnyObject>'

3 个答案:

答案 0 :(得分:3)

问题

你想使用这样的代码:

if let index = array.indexOf(dict) {
    // do something
}

但它不起作用。为什么?好吧,看看方法的定义:

extension CollectionType where Generator.Element : Equatable {
    /// Returns the first index where `value` appears in `self` or `nil` if
    /// `value` is not found.
    ///
    /// - Complexity: O(`self.count`).
    @warn_unused_result
    public func indexOf(element: Self.Generator.Element) -> Self.Index?
}

此方法仅在数组的元素为Equatable时才有效。但Dictionary不是Equatable

即使您的find()方法无法正常运行,它也必须依赖Equatable,这就是您的代码失败的原因。

解决方案

你可以声明一个自定义结构并使用它,这有很多原因:

struct Person : Equatable {
    let name : String
    let city : String
}

func ==(lhs: Person, rhs: Person) -> Bool {
    return true
}

let john = Person(name: "John", city: "New York")
let jane = Person(name: "Jane", city: "Boston")

var array = [john, jane]

for person in array {
    if let index = array.indexOf(person) {
        // do something with index
    }
}

对于快速而肮脏的解决方案,只需调用enumerate(),其中包含元组中每个元素的索引:

var dict = [String:AnyObject]()
var array = [[String:AnyObject]]()

dict["name"] = "John"
dict["city"] = "New York"
array.append(dict)

for (index, element) in array.enumerate() {
    // do something with index
}

答案 1 :(得分:0)

除了Aarons的答案(很棒),您还可以使用idetity运算符:

for eachDict in array {
      if eachDict === dict {
           Save the World....
      }
 }

答案 2 :(得分:-2)

你也可以这样做:

   var arrayOfDic: [[String: String]] = []
   let searchAbleDic:[String: String]
   var row:Int = 0

   for var i = 0; i < self.arrayOfDic.count; i++ 
   {
      let arrayElement:[String: String] = self.arrayOfDic[i]
      if arrayElement.keys.first == searchAbleDic.keys.first
      {
         //Found
      }
   }