请查看下面的代码,当我将字典对象添加到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";
}
)
答案 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"
我认为更清楚。
代码的步骤(已解释):
这样:
let tempArray = NSMutableArray() // ---> tempArray = []
这样:
let dict = NSMutableDictionary() // ----> dict = {}
这样:
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"}
这样:
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"}
这样:
// -----> tempArray = [dict] // Notice that I put here only pointer to the dict
这样:
// -----> 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)
}
}