2014-04-01 64 views
2

更換對象我有一個數組結構如下:在字典中的數組

NSMutableArray topArray{ 
    NSMutableArray middleArray{ 
     NSMutableArray lowerArray{ 
      NSMutableDictionary dict{ 
      } 
     } 
    } 
} 

陣列結構填充有一些數據,我從web取回是JSON格式。

我想編輯的對象之一中的NSMutableDictionary如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSMutableArray *lowerArray = [[self middleArray] objectAtIndex:[indexPath section]]; 
    NSMutableDictionary *dict = [lowerArray objectAtIndex:[indexPath row]]; 

    [dict setObject:[NSNumber numberWithInt:1] forKey:@"key"]; 

    [[self tableView] reloadData]; 
} 

內每個陣列的數據是正確的(我曾與打印語句檢查),但是,當我嘗試改變對象的字典,我得到了以下錯誤: 原因:

'-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

我所需要的對象在字典中的陣列結構中的變化。

這可能是JSON數據的問題,因爲當topArray首次使用JSON數據初始化時,中間和低位數組的形式只是NSArray的?

對不起,如果這是令人困惑,我會嘗試澄清更多,如果您有任何問題。

在此先感謝您的幫助。

+1

你是如何初始化數據結構的? – bgfriend0

+0

如果您從NSJSONSerialization獲取JSON,則可以選擇讓它返回可變對象。打開該選項,你的問題應該結束了。 –

+0

請注意,只是因爲聲明瞭指針,NSMutableDictionary並不意味着它指向的對象是可變的,甚至不是字典。 –

回答

2

如果您使用NSJSONSerialization,你可以通過NSJSONReadingMutableContainers+JSONObjectWithData:options:error:options參數,並解析出的所有詞典和陣列將是可變的。

NSMutableArray *topArray = [NSJSONSerialization JSONObjectWithData:webServiceData 
                  options:NSJSONReadingMutableContainers 
                  error:nil]; 
+0

正是我在找的謝謝:) – myles

1

只使用NSMutableDictionary類而不是NSDictionarymoduleDict變量。解析JSON對象時很容易完成。如果沒有 - 創建一個這樣的:

NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithDictionary: moduleDict];

+1

問題是他的字典是在一個幾乎肯定不可變的數組中。所以他不能在不復制所有內容的情況下更新他的結構最好使用NSJSONSerialization選項。 –

0

我懷疑你真的在處理最底層的NSMutableDictionary。您是否有這些印刷報表的輸出給我們?

通常由JSON反序列化生成的結構是不可變的類型。這正是你的錯誤信息所說的。