2016-07-26 13 views
0

辞書の中に辞書の配列があります。iOS Swift Updating Dictionary in Adapters

var fillups:[NSMutableDictionary] = [] 

それから私はこのようにそれをロードします:

fillups = userDefaults.object(forKey: car) as! NSArray as! [NSMutableDictionary] 

私は、配列内の辞書の要素を更新しようとすると、その後、私は「不変オブジェクトに送信された変異法」を取得私はこのようにそれを初期化しますエラー。レコードを更新するコードは次のとおりです。

let dict=fillups[row] 
dict.setValue(odometerField.text, forKey: "odometer") 
dict.setValue(gallonsField.text, forKey: "gallons") 
fillups[row]=dict 

最初のsetValue行にエラーが発生します。

+3

'として! NSArrayとして! [NSMutableDictionary] 'これはまるで*これがいつかクラッシュしたかったようです。 ;)巻き戻しを強制したり、強制的に投げたりしないでください。オプションのバインディング( 'if let')や他の安全なアンラッピング手法を使用してください。 – Moritz

+0

これは実際にXcodeが要求した構文でした。しかし、私はこのfillups = userDefaults.object(forKey:car)に変更しました! [NSMutableDictionary]とXcodeはそれを好きでした。しかし、同じ問題を抱えています。 –

+0

Xcodeが正しく動作しませんでした。それは時々...フォースキャストはすでに可能な限り禁止するものなので、ダブルキャストを見ると、あなたは何か非常に間違っていることを知っています。あなた自身。 :) – Moritz

答えて

0

オブジェクトは、それらが挿入されたとき、彼らは変更可能であったとしても不変であるべきです。デフォルトから取得した不変オブジェクトを取得し、変更可能なオブジェクトを作成する必要があります。また、アプリをクラッシュさせたくない場合は、どこでも強制的にアンラップするべきではありません。

if let array = userDefaults.object(forKey: car) as? [NSDictionary] { 
    fillups = array.map { ($0.mutableCopy() as! NSMutableDictionary) } 
} 

NSMutableDictionaryが参照型であり、あなたは、配列が既に配列内の1を編集してからの撤退の参照を編集するため、また、fillips[row] = dictラインを必要としません。

+0

パーフェクト!それは素晴らしい仕事でした! –

0

あなたの辞書を突然変異させたい場合は、 'let'ではなく 'var'でそれを宣言する必要があります。 'let'は定数です。コメントで指摘アンラップの問題を修正。また

let dict=fillups[row] 

あなたはNSUserDefaultsから取得

var dict=fillups[row]