0

NSArraynullを許可しない NSDictionariesの writeToFile メソッドを使用しようとしています。ループしてそれらを見つけて空NSStringのに置き換えるだけだと思いましたが、動作させることができません。これが私が試みていることです。

編集: 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 は変更可能です。

調子はどう?これを行うより良い方法はありますか?

編集:新しいバージョンを別の回答に移動しました。

4

2 に答える 2

5

辞書が変更可能であることをどのように知っていますか? そうではないようです。列挙中にそれらを入力してNSMutableDictionaryも、それらは変更可能になりません。ディクショナリを調べて、キーを新しい変更可能なキーに移動し、null をフィルタリングすることができます。

また、辞書が からのものである場合はNSJSONSerialization、 を見てくださいNSJSONReadingOptions。デシリアライズされた構造に変更可能なコンテナを使用するオプションがあります。これは常に良い解決策とは限りませんが、チェックする価値はあります。

列挙中に辞書を変更することに関しては、キーを変更することはできません。これは、列挙コードを簡単に破棄する可能性があるためです。しかし、キー値を変更できなかった理由がわかりません。それがあなたの求めているすべてです。このコードは機能します:

NSMutableDictionary *dict = [@{@"foo" : @"bar"} mutableCopy];
for (NSString *key in dict) {
    dict[key] = @"baz";
}
于 2012-11-17T09:05:43.807 に答える
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;
于 2012-11-18T21:56:15.793 に答える