私はApp App Purchasesを実装しようとしています。ユーザーがNSUserDefaults
で購入した購入を追跡しています。私は各購入の値を設定する関数を持っていますが、実行時にの代わりにvar
と宣言され、NSMutableDictionary
であるにもかかわらず、購入値の辞書に突然変異が生じているというエラーが表示されます。時にはうまくいくこともありますが、ほとんどの場合はそうではありません。 var
の代わりにlet
で変数を宣言することについていくつかの警告が出ますが、変数を最大限に変更するために無視します。なぜこれは機能しませんか?即時変更可能な辞書が不変として扱われています
私が手にエラーがある:
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()
}
}
@ozgur私はキー値のペアを設定しているので、それは 'NSMutableDictionary'型でなければなりません。普通の 'AnyObject'型は、私が知る限り、それを私にさせません。 – Aderis
@ozgurあなたのコメントを回答してください。それはうまくいったようですが、私は理由を知りません。 – Aderis