我有两个字典,如:
var dict1 = [Int:[String:AnyObject]]
var dict2 = [Int:[String:AnyObject]]
例如:
dict1:[0:["发件人":"用户1","时间":NSDate()," mId":& #34; as2f2ASf"],[1:["发件人":"用户1","时间":NSDate()," mId&# 34;:" Sjf82FsJ"]
dict2:[0:["发件人":"用户2","时间":NSDate()," mId":& #34; J2fAS92D"],[1:["发件人":"用户2","时间":NSDate()," mId&# 34;:" Sjf82FsJ"]
我想知道字典是否具有相同mId的数据,以及是否,我想做一些动作。 我为此编写了这段代码并得到了这些错误。
for (_, value) in dict1! {
for content in value {
if content.0 == "mId" {
var mID = content.1
for (_, 2ndValue) in dict2 {
for 2ndContent in 2ndValue {
if 2ndContent.0 == "mId" {
var 2ndMID = 2ndContent.1
if mID == 2ndMID {
//Do Some Action
}
}
}
}
}
}
}
以下是错误: https://www.dropbox.com/s/e28ple6640hkrzo/Bildschirmfoto%202015-08-28%20um%2021.21.54.png?dl=0
答案 0 :(得分:1)
嗯,我不确定我理解你的问题,但这是我的想法:
for (key, value) in dicOne {
for (keyTwo, valueTwo) in dicTwo {
for (keyItem,valueItem) in value {
for (keyItemTwo, valueItemTwo) in valueTwo {
if keyItem == keyItemTwo && valueItem == valueItemTwo{
println("do some action")
}
}
}
}
}
第一个循环用于第一个字典,第二个循环用于另一个字典。在此之后,您将进入两个词典的第二层[" a":" A"]。所以下一步是获取这本词典。这是另外两个循环。
只是一个问题:你试过元组吗?像这样:
var dictionaryOne:[Int: (String, String)] = [1: ("a", "A")]
var dictionaryTwo:[Int: (String, String)] = [1: ("a", "A")]
for (key, value) in dictionaryOne {
for (keyTwo, valueTwo) in dictionaryTwo {
if value.0 == valueTwo.0 && value.1 == valueTwo.1 {
println("nice action")
}
}
}
答案 1 :(得分:1)
首先,正如Eric在评论中所说的那样,您收到错误是因为您无法使用数字启动变量名称。
其次你在这里调用'字典'实际上是一个元组数组 - 如果你通过运行dict1
在Swift REPL中定义你的var dict1 = [Int,[String,AnyObject]()
变量,你会得到:
dict1: [(Int, [String : AnyObject])] = 0 values
将定义具有等效结构的字典:
var dict1 = [Int:[String:AnyObject]]()
- 这会返回
dict2: [Int : [String : AnyObject]] = 0 key/value pairs
在REPL。
因此,您显示的dict1和dict2声明将无效。它们需要声明如下以匹配您指定的类型:
var dict1 = [(0, ["sender": "user1", "time": NSDate(), "mId": "as2f2ASf"]), (1, ["sender": "user1", "time": NSDate(), "mId": "Sjf82FsJ"])]
var dict2 = [(0, ["sender": "user2", "time": NSDate(), "mId": "J2fAS92D"]), (1, ["sender": "user2", "time": NSDate(), "mId": "Sjf82FsJ"])]
如果您想使用实际字典,请使用:
var dict3 = [[0: ["sender": "user1", "time": NSDate(), "mId": "as2f2ASf"]], [1: ["sender": "user1", "time": NSDate(), "mId": "Sjf82FsJ"]]]
虽然我可以在你发布的代码中看到你想要达到的目标,但我认为你所采用的方法并不正确。每当你有4级嵌套for
循环时,你应该考虑是否有更好的方法来解决问题。
当您只对“mId”的值感兴趣时,您正在迭代字典中的所有键。只要找到那个键的值就可以摆脱2个循环,并且对你不感兴趣的东西进行大量无意义的迭代:
for (_,value1) in dict1 {
if let mld1 = value1["mId"] {
for(_,value2) in dict2 {
if let mld2 = value2["mId"] {
if mld1 == mld2 {
println("Found diff")
}
}
}
}
}
if let
是确保您进行有效比较所必需的(例如,如果两个词组中'mld'的值为nil
,则避免误报。不知道这在您的数据模型中是否可行,但总是值得彻底。请注意,此解决方案使用元组数组,如示例中所示 - 如果使用实际字典,则需要稍微不同的内容。