Swift - 比较字典

时间:2015-08-28 19:23:35

标签: ios swift dictionary swift2

我有两个字典,如:

  

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

2 个答案:

答案 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,则避免误报。不知道这在您的数据模型中是否可行,但总是值得彻底。请注意,此解决方案使用元组数组,如示例中所示 - 如果使用实际字典,则需要稍微不同的内容。