Swift 可变字典被视为不可变

2024-02-18

我正在尝试实施应用内购买,并且正在跟踪用户通过哪些购买进行了购买NSUserDefaults。我有一个设置每次购买的值的函数,但是当它运行时,我收到一条错误消息,指出我正在改变购买值的字典,即使该字典是用var代替let并且是一个NSMutableDictionary。有时它确实有效,但大多数时候它不起作用。我收到一些关于声明变量的警告let代替var,但我忽略它们以使我的变量具有最大的可变性。为什么这不起作用?

我得到的错误是:

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

Code:

static func setPurchased(purchase:PurchaseID, value:Bool)
{
    let defaults = NSUserDefaults.standardUserDefaults()

    if (defaults.objectForKey(PURCHASES_KEY) == nil)
    {
        initializePurchases()       // go set some initial values
    }

    if var purchases = (defaults.objectForKey(PURCHASES_KEY) as? NSMutableDictionary)   // WARNING: should be declared with let because not mutated
    {
        print("setting purchase \(purchase.id()) to \(value)")
        var key = purchase.id()   // WARNING: should be declared with let because not mutated

        purchases[key] = value    // CRASH HERE
        defaults.setObject(purchases, forKey:PURCHASES_KEY)
        defaults.synchronize()
    }
}

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

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

if var purchases = defaults.objectForKey(PURCHASES_KEY) as? Dictionary<String: AnyObject> {
  ...
  purchases[key] = value
}

请参见这个问题 https://stackoverflow.com/questions/24096096/immutable-mutable-collections-in-swift有关集合类型中的可变性/不可变性的更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 可变字典被视为不可变 的相关文章

随机推荐