0

Mutable ではないディクショナリのキー 'distance' の値を更新したいのですが、json から読み取ったディクショナリで構成される配列があります。アプリですべての距離値を更新する必要があります。サンプル コードを教えてください。どうすればこれを行うことができますか?

この配列を作成する場所は次のとおりです。

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    self.seachResult =[NSJSONSerialization JSONObjectWithData:responseData options:nil error:nil];

ここにサンプル情報があります:

2013-07-20 00:04:41.753 MyApp[61075:16a03] sorted array of dictionaries: (
    {
    cid = 2;
    distance = 0;
    image = "http://images.png";
    latitude = "48.245565";
    longitude = "16.342333";
    manual = "";
    movie = "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v";
    pcode = 023942435228;
    pid = 1;
    pname = "example product";
    price = "12.00";
    qrcode = "";
    rid = 1;
    rname = "Example Retailer Name";
    sale = 0;
    "sale_percent" = 0;
    "sale_price" = "0.00";
    text = "here is text about sample product number 1...\nasdasdasda\nsdfsdfsd\nSdfsdf
},
    {
    cid = 1;
    distance = 0;
    image = "";
    latitude = "";
    longitude = "";
    manual = "";
    movie = "";
    pcode = 1;
    pid = 3;
    pname = "test product";
    price = "46.00";
    qrcode = "";
    rid = 2;
    rname = "";
    sale = 0;
    "sale_percent" = 0;
    "sale_price" = "35.00";
    text = "some text here...

},
    {
    cid = 2;
    distance = 0;
    image = "httpestImage";
    latitude = "48.245565";
    longitude = "16.342333";
    manual = "";
    movie = "";
    pcode = 1;
    pid = 2;
    pname = "sample product 2";
    price = "126.00";
    qrcode = "";
    rid = 1;
    rname = "Example Retailer Name";
    sale = 1;
    "sale_percent" = 20;
    "sale_price" = "99.99";
    text = "here is text about sample product number 2...\nblah blah blah\nasdasdasd\nASdasdas\nASdasdasd";
}
)

テストのためにこれを試しましたが、そのような単純な辞書の値を更新することさえできません:

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      @"value1", @"key1", @"value2", @"key2", nil];
[dict setValue:@"test" forKey:@"key2"];

エラー:

2013-07-20 00:46:08.086 NSdictionaryTest[61130:11303] * キャッチされない例外 'NSUnknownKeyException' が原因でアプリを終了しています。キー key2 の場合。* First throw call stack: (0x1c90012 0x10cde7e 0x1d18fb1 0xb79e41 0xafb5f8 0xafb0e7 0x2200 0xf31c7 0xf3232 0x423d5 0x4276f 0x42905 0x4b917 0xf96c 0x1094b 0x21cb5 0x22beb 0x14698 0x1bebdf9 0x1bebad0 0x1c05bf5 0x1c05962 0x1c36bb6 0x1c35f44 0x1c35e1b 0x1017a 0x11ffc 0x1e5d 0x1d85) libc++abi.dylib: terminate called throwing an exception

4

3 に答える 3

2

不変の辞書を使用する必要がある特定の理由はありますか?

NSMutableDictionaryを使用できます

self.seachResult はあなたの NSDictionary だと思います。単に NSMutableDictionary として宣言できます。

次のように初期化します。

self.seachResult = [NSMutableDictionary dictionaryWithCapacity:10];
[self.seachResult addEntriesFromDictionary: NSJSONSerialization JSONObjectWithData:responseData options:nil error:nil]]; 
[self.seachResult setObject:YOUR_UPDATED_VALUE_HERE forKey:@"distance"];

さらに、新しい NSMutableDictionary を作成し、次のように変更不可のエントリを入力することもできます。

NSMutableDictionary *mutableSearchResults = [NSMutableDictionary dictionaryWithCapacity:[self.seachResult count]];
[mutableSearchResults addEntriesFromDictionary: self.seachResult];
[self.seachResult setObject:YOUR_UPDATED_VALUE_HERE forKey:@"distance"];

不変のものを再び返したい場合は、次のようにするだけです。

[mutableSearchResults copy];

お役に立てば幸いです。ここのコードは SO エディターで入力したところなので、スペルが間違っている可能性があることに注意してください。

于 2013-07-19T22:28:23.950 に答える
2

JSONObjectWithData によって返される辞書を変更する場合は、NSJSONReadingMutableContainers オプションを使用します。これにより、メソッドは変更可能なコンテナー クラスを返します。例えば:

self.seachResult =[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
于 2013-07-19T22:22:28.237 に答える
0

NSDictionary は不変です (作成後に変更することはできません)。代わりに NSMutableDictionary を見てください。ところで -- NSDictionary から NSMutableDictionary を作成するのは簡単です。

于 2013-07-19T22:19:02.383 に答える