2012-11-17 16 views
0

我試圖使用不允許空值的NSDictionaries的NSArray的writeToFile方法。我想通過循環找到它們,並替換爲空的NSString's,但我無法實現它的工作。這是我正在嘗試的。如何從NSDictionary中刪除<null>的?

編輯:NSArrays和NSDictionaries由NSJSONSerialization創建。

for (NSMutableDictionary *mainDict in mainArray) 
{ 
    for(NSMutableDictionary *subDict in mainDict) 
    { 
     for(NSString *key in subDict) 
     {     
      id value = [subDict objectForKey:key]; 

      if (value == [NSNull null]) 
      { 
       [subDict setObject:@"" forKey:key]; 
      } 
     } 
    } 
} 

但是這會引發異常。 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

但是正如你所看到的所有NSDictionaries都是可變的。

這是怎麼回事? 有沒有更好的方法來做到這一點?

編輯:將新版本移至單獨的答案。

回答

5

你怎麼知道字典是可變的?看起來他們不是。在枚舉期間將它們鍵入爲NSMutableDictionary不會使它們變爲可變。您可以遍歷字典並將其移動到一個新的可變元素中,過濾空值。

此外,如果您的字典來自NSJSONSerialization,請查看NSJSONReadingOptions,可以選擇使用可變容器作爲反序列化結構。這並不總是一個好的解決方案,但值得一試。

至於在枚舉字典的同時進行變異:你不能改變這些鍵,因爲這很容易拋出枚舉代碼。但我不明白爲什麼你不能改變關鍵值,這是你所追求的。此代碼的作品:

NSMutableDictionary *dict = [@{@"foo" : @"bar"} mutableCopy]; 
for (NSString *key in dict) { 
    dict[key] = @"baz"; 
} 
+3

此外,枚舉時變更字典是錯誤並引發異常。 – 2012-11-17 09:07:14

+1

是啊.....我會建議創建一個單獨的NSDictionary,並將其設置爲這個字典,他枚舉後枚舉 – MCKapur

+0

好的謝謝。很難知道樹的結構,因爲它是由NSJSONSerialization創建的。我創建了一個帶有可變副本的新版本。我在這裏的正確軌道還是錯過了這一點? – TijuanaKez

0

或重建整個樹的作品。

NSMutableArray *newMainArray = [[NSMutableArray alloc] init]; 
for (NSArray *subArray in self.mainArray) 
{ 
    NSMutableArray *newSubArray = [[NSMutableArray alloc] init]; 
    for(NSDictionary *dict in subArray) 
    { 
     NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init]; 
     for(NSString *key in dict) 
     {    
      id value = [dict objectForKey:key]; 
      if (value == [NSNull null]) 
      { 
       [newDict setObject:@"" forKey:key]; 
      } else { 
       [newDict setObject:value forKey:key]; 
      } 
     } 
     [newSubArray addObject:newdict]; 
     [newDict release]; 
    } 
    [newMainArray addObject:newSubArray]; 
    [newSubArray release]; 
} 
[self.mainArray release];  <---- ???? 
self.mainArray = newMainArray; 
+0

這個代碼還有一個問題,如果在將它指向newMainArray之前釋放self.mainArray,它將引發一個異常,該屬性被定義爲'@property(nonatomic,retain)NSMutableArray * mainArray;'。我可以在不首先釋放的情況下重新分配它嗎? – TijuanaKez