数组添加了重复对象

时间:2018-06-19 05:09:12

标签: swift

请查看下面的代码,当我将字典对象添加到NSMutableArry时,它会给我重复的对象。 tempArray 是我要保存所有对象的数组。 字段是我将过滤某些对象的另一个数组。

let tempArray = NSMutableArray()
        for  i in 0..<fields.count {
            let dict = NSMutableDictionary()
            dict .setValue(fields[i].value(forKey: "interface_id"), forKey: "interface_id")
            dict .setValue(fields.fields[i].value(forKey: "type"), forKey: "type")
            dict .setValue(fields.fields[i].value(forKey: "icon"), forKey: "icon")

            if fields.fields[i].value(forKey: "type") == "Name"{
                dict .setValue("First Name", forKey: "label_name")
                dict .setValue("first_column", forKey: "column_name")
                tempArray.add(dict)

                dict .setValue("Last Name", forKey: "label_name")
                dict .setValue("last_column", forKey: "column_name")
                tempArray.add(dict)
            }
        }

输出

(
        {
        "interface_id" = 1;
        "type" = "Name";
        "icon" = "G.JPG";
        "label_name" = "Last Name";
        "column_name" = "last_column";

       },    
{
        "interface_id" = 2;
        "type" = "Name";
        "icon" = "G.JPG";
        "label_name" = "Last Name";
        "column_name" = "last_column";
       }
)

但预期输出:

(
        {
         "interface_id"=1;
         "type"="Name";
         "icon"="G.JPG";
         "label_name"="First Name";
         "column_name"="first_column";
        },
  {
        "interface_id"=2;
        "type"="Name";
        "icon"="G.JPG",
        "label_name"="Last Name";
        "column_name"="last_column";
        }
  )

1 个答案:

答案 0 :(得分:1)

您的代码中有错误。 在相同的for循环迭代中,您可以这样做:

       if fields.fields[i].value(forKey: "type") == "Name"{
            dict .setValue("First Name", forKey: "label_name")
            dict .setValue("first_column", forKey: "column_name")
            tempArray.add(dict)

            dict .setValue("Last Name", forKey: "label_name")
            dict .setValue("last_column", forKey: "column_name")
            tempArray.add(dict)
        }

首先将label_name设置为First Name,然后将其更正为Last Name。

因为你对循环迭代没有任何改变,所以每个循环之间应该没有区别。

编辑:

感谢@rmaddy的评论。 我完全同意:不要在Swift中使用NSMutableDictionary,除非你真的知道为什么需要它。 (对象引用,... - 来自Swift的NSMutableDictionary和Dictionary具有不同的内存管理规则)。

此外,我会避免使用.setValue或.setObject。我宁愿使用

dict["column_name"] = "last_column"

我认为更清楚。

代码的步骤(已解释):

  1. 首先创建数组
  2. 这样:

    let tempArray = NSMutableArray()  // ---> tempArray = []
    
    1. 你通过第一次迭代循环(i == 0)
    2. 您创建了dictinary
    3. 这样:

      let dict = NSMutableDictionary() // ----> dict  = {}
      
      1. 您在
      2. 中添加了三个值

        这样:

        dict .setValue(fields[i].value(forKey: "interface_id"), forKey: "interface_id")
        dict .setValue(fields.fields[i].value(forKey: "type"), forKey: "type")
        dict .setValue(fields.fields[i].value(forKey: "icon"), forKey: "icon")
        //   ----->  dict = {"interface_id" : 1, "type" : "Name", "icon" : "G.JPG"}
        
        1. 然后你检查&#34;输入&#34; ==&#34;姓名&#34;
        2. 因为你确实添加了
        3. 这样:

          dict .setValue("First Name", forKey: "label_name")
          dict .setValue("first_column", forKey: "column_name")
          //   ----->  dict = {"interface_id" : 1, "type" : "Name", "icon" : "G.JPG", "label_name": "First Name", "column_name": "first_column"}
          
          1. 您将此词典添加到数组
          2. 这样:

            // ----->  tempArray = [dict] // Notice that I put here only pointer to the dict
            
            1. 您将字典更改为
            2. 这样:

              //   ----->  dict = {"interface_id" : 1, "type" : "Name", "icon" : "G.JPG", "label_name": "Last Name", "column_name": "last_column"}
              

              在这一刻,你改变对象巫婆dict指向:所以这意味着在tempArray里面你现在在第一个位置有这个新值:

              // it is still 
              // ----->  tempArray = [dict]
              // but : dict = {"interface_id" : 1, "type" : "Name", "icon" : "G.JPG", "label_name": "Last Name", "column_name": "last_column"}
              

              这就是为什么如果你完全不知道你使用它们的原因,不要在Swift中使用NSMutableDictinary和NSMutableArray

              建议的代码是:

              var tempArray: [Any] = []
                  for  i in 0..<fields.count {
                      let dict:[String:String] = [:]
                      dict["interface_id"] = fields[i].value(forKey: "interface_id")
                      dict["type"] = fields.fields[i].value(forKey: "type")
                      dict["icon"] = fields.fields[i].value(forKey: "icon")
              
                      if dict["type"] == "Name"{
                          dict["label_name"] = "First Name"
                          dict["column_name"] = "first_column"
                          tempArray.append(dict)
              
              
                          // In Swift Array we append object not reference, so this is working now.
                          dict["label_name"] = "Last Name"
                          dict["column_name"] = "last_column"
                          tempArray.add(dict)
                      }
                  }