为什么我找不到字典数组中字典的索引?我知道每个字典的键值对都是无序的,但是数组在数组中的顺序应该是有序的,因此我应该能够找到索引。
例如:
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>'
答案 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
}
}