Ios 使用以前删除的项目更新字典
我有两本字典。都在viewController中声明,都基于模型结构类Ios 使用以前删除的项目更新字典,ios,swift,dictionary,Ios,Swift,Dictionary,我有两本字典。都在viewController中声明,都基于模型结构类 // ItemDictionary var ItemDictionary = ItemModel() var JSONDictionary = ItemModel() JSON数据被输入JSONDictionary,然后该数据被传递到ItemDictionary,ItemDictionary在ViewDidLoad中为一个表提供数据 self.ItemDictionary = self.JSONDictionary 一切
// 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
而不是SwiftDictionary
。这是真的,Dictionary
是一种值类型,并且是复制的。但是什么是ItemModel
?我怀疑它是一个类,因此ItemDictionary
和JSONDictionary
指向同一个对象。如果它们是对象,而不是删除数据,只需删除引用项字典(分配给nil)。因此,JSONDictionary将保留数据OK。然后不要像我在前面的评论中所说的那样删除ItemDictionary的数据。删除引用即可。应该工作:-)并且要小心。你问的和你想问的可能不一样。:-)我理解这是预期的。如果Dictionary1=Dictionary2,则实际上不会创建新的字典。只有第二个地址。因此,如果更改Dictionary1,Dictionary2也会更改