Ios 使用以前删除的项目更新字典

Ios 使用以前删除的项目更新字典,ios,swift,dictionary,Ios,Swift,Dictionary,我有两本字典。都在viewController中声明,都基于模型结构类 // ItemDictionary var ItemDictionary = ItemModel() var JSONDictionary = ItemModel() JSON数据被输入JSONDictionary,然后该数据被传递到ItemDictionary,ItemDictionary在ViewDidLoad中为一个表提供数据 self.ItemDictionary = self.JSONDictionary 一切

我有两本字典。都在viewController中声明,都基于模型结构类

// ItemDictionary
var ItemDictionary = ItemModel()
var JSONDictionary = ItemModel()
JSON数据被输入JSONDictionary,然后该数据被传递到ItemDictionary,ItemDictionary在ViewDidLoad中为一个表提供数据

self.ItemDictionary = self.JSONDictionary
一切都好。该表由JSON数据很好地填充。我还可以从表和ItemDictionary中删除项。然而,当我试图通过引用原始字典(JSONDictionary)来添加条目时,该条目已经消失了

我知道这是意料之中的。如果Dictionary1=Dictionary2,则不会实际创建新词典。只有第二个地址。所以,如果你改变字典1,字典2也会改变

一个实际的例子是设定价格范围。您可以缩小范围,减少表上显示的项目。但是,如果您想增加价格范围,则无法替换以前删除的项目。我不想每次编辑范围时都调用JSON脚本。感谢您的建议。

请试用此代码-

var dictionary1 = ["name": "Magnus"]
var dictionary2 = dictionary1
dictionary2.removeAll()
print("\(dictionary2) \(dictionary1)")
输出为:-

[:] ["name": "Magnus"]
因此,正在创建两个新词典。如果您参考Swift文档,您会发现在Swift中,几乎不存在引用。
可能是代码的其他部分造成的。希望这有帮助:-)

正如OP确认的那样,
ItemModel
是一个类,而不是一个
字典。要解决这个问题,您需要将
ItemModel
变成一个真正的
字典,从而成为一个值类型。这可能是首选,但将是更多的工作

另一种方法是向实例化自身新副本的
ItemModel
类添加一个方便的初始值设定项,并调用该初始值设定项,而不是设置
self.ItemDictionary=self.JSONDictionary

像这样的

init(model: ItemDictionary) -> ItemDictionary {
   // copy properties
}
然后创建新副本

self.ItemDictionary=ItemDictionary(self.JSONDictionary)


稍后,您可以使用相同的调用重新初始化
项目字典。

您可以将项目添加回字典。请显示您的代码。
ItemModel()
返回的类型是什么?听起来您使用的是
NSMutableDictionary
而不是Swift
Dictionary
。这是真的,
Dictionary
是一种值类型,并且是复制的。但是什么是
ItemModel
?我怀疑它是一个类,因此
ItemDictionary
JSONDictionary
指向同一个对象。如果它们是对象,而不是删除数据,只需删除引用项字典(分配给nil)。因此,JSONDictionary将保留数据OK。然后不要像我在前面的评论中所说的那样删除ItemDictionary的数据。删除引用即可。应该工作:-)并且要小心。你问的和你想问的可能不一样。:-)我理解这是预期的。如果Dictionary1=Dictionary2,则实际上不会创建新的字典。只有第二个地址。因此,如果更改Dictionary1,Dictionary2也会更改