2016-05-13 60 views
3

我試圖在應用內購買,並且我正在跟蹤用戶通過NSUserDefaults購買了哪些購買。我有一個函數設置每次購買的價值,但是當它運行時,我得到一個錯誤,說我正在改變購買價值的字典,即使字典聲明爲var而不是let,並且是NSMutableDictionary。有時它確實有效,但大部分時間沒有。我收到了一些關於用let而不是var聲明我的變量的警告,但我忽略它們以使我的變量具有最大的可變性。爲什麼這不起作用?Swift可變字典被視爲不可變

我得到的錯誤是:

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

代碼:

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() 
    } 
} 
+0

@ozgur由於我設置了一個鍵值對,它必須是'NSMutableDictionary'類型。就我所知,常規的舊AnyObject類型不會讓我這樣做。 – Aderis

+0

@ozgur讓你的評論一個答案。它似乎有效,但我不知道爲什麼。 – Aderis

回答

3

這不是轉換一個不變的詞典到其可變對方的正確方法。

var已經確保了無論是從defaults.objectForKey(PURCHASES_KEY)返回將被複製爲一個可變的類型,因此你需要的是,如果你確定所有鍵String類型指定可變對象這在我們的情況下,可以安全地Dictionary<String: AnyObject>的類型:

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

請參閱this SO question有關集合類型的易變性/不變性的更多信息。