Swift可变字典被视为不可变

时间:2016-05-13 22:51:34

标签: swift nsuserdefaults immutability nsmutabledictionary

我正在尝试实施应用内购买,并且我正在跟踪用户通过NSUserDefaults购买的商品。我有一个设置每次购买的值的函数,但是当它运行时,我得到一个错误,说我正在改变购买值的字典,即使字典是用var而不是{{1}声明的并且是let。有时它确实有效,但大部分时间都没有。我收到一些关于使用NSMutableDictionary而不是let声明变量的警告,但我忽略它们以使我的变量最大可变性。为什么这不起作用?

我得到的错误是:

var

代码:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

1 个答案:

答案 0 :(得分:3)

这不是将不可变字典转换为可变字典的正确方法。

var已经确保从defaults.objectForKey(PURCHASES_KEY)返回的任何内容都将被复制为可变类型,因此您只需指定可变对象的类型,在我们的例子中可以安全地{{1}如果您确定所有密钥都是Dictionary<String: AnyObject>类型:

String

有关集合类型中的可变性/不变性的更多信息,请参阅this SO question