2016-04-05 15 views
0

私は2つの辞書を持っています。どちらもviewControllerで宣言されていますが、両方ともモデル構造クラスに基づいています。以前に削除されたアイテムの辞書を更新します。

// ItemDictionary 
var ItemDictionary = ItemModel() 
var JSONDictionary = ItemModel() 

JSONデータがJSONDictionaryに供給され、その後、このデータはのviewDidLoad内のテーブルを供給するItemDictionaryに渡されます。

self.ItemDictionary = self.JSONDictionary 

すべていいです。表はJSONデータからうまく取り込まれています。テーブルとItemDictionaryからアイテムを削除することもできます。しかし、元の辞書(JSONDictionary)を参照して項目を追加しようとすると、その項目はなくなりました。

私はこれが予想されることを理解しています。 Dictionary1 = Dictionary2の場合、実際には新しい辞書は作成されません。 2番目のアドレスのみ。したがって、Dictionary1を変更すると、Dictionary2も変更されます。

実際の例では、価格帯を設定することができます。範囲を小さくして、テーブルに表示されるアイテムを少なくすることができます。ただし、価格帯を増やしたい場合は、以前に削除したアイテムを置き換えることはできません。私は範囲を編集するたびにJSONスクリプトを呼び出す必要はありません。アドバイスありがとうございます。

+0

辞書に項目を追加することができます。コードを表示してください。 –

+0

'ItemModel()'によって返される型は何ですか? Swiftの 'Dictionary'ではなく' NSMutableDictionary'を使っているようです。 –

答えて

0

OPによって確認されたように、ItemModelはクラスであり、Dictionaryではありません。これを修正するにはItemModelを実際のDictionaryとする必要があります。これはおそらく選択肢ですが、より多くの作業が必要になります。

self.ItemDictionary = self.JSONDictionaryの代わりに、新しいコピーをインスタンス化するItemModelクラスに便利な初期化子を追加することもできます。

このようなものです。

init(model: ItemDictionary) -> ItemDictionary { 
    // copy properties 
} 

次に、新しいコピーを作成します。

self.ItemDictionary = ItemDictionary(self.JSONDictionary)

後で、同じ呼び出しでItemDictionaryを再初期化することができます。

0

出力OUT-

var dictionary1 = ["name": "Magnus"] 
var dictionary2 = dictionary1 
dictionary2.removeAll() 
print("\(dictionary2) \(dictionary1)") 

このコードを試してみてくださいです: -

[:] ["name": "Magnus"] 

このように2つの新しい辞書が作成されています。 Swiftのドキュメントを参照すると、すぐに参照がほとんど存在しないことがわかります。 コードの他の部分が原因である可能性があります。これが役に立ったらいいですね:-)

+0

これは本当であり、 'Dictionary'は値の型であり、コピーされます。しかし、 'ItemModel'は何ですか?私はそれがクラスだと思うので、 'ItemDictionary'と' JSONDictionary'が同じオブジェクトを指しています。 –

+0

うん。それらがオブジェクトであれば、データを削除するのではなく、参照ItemDictionary(nilに代入)を削除するだけです。したがって、JSONDictionaryはデータを保持します – Abhishek729

+0

両方の辞書が同じオブジェクトを指しています。 – Magnus

関連する問題