nsdictionaryキーを変更できますか?
-
04-10-2019 - |
質問
私は、そのキーとオブジェクトのnsmutable -estringsによって入力されるnsdictionaryオブジェクトを持っています。元のnsmutablestringをSetString:Methodで変更することで、キーを変更することができました。ただし、キーは、最初にキーを設定するために使用される文字列の内容に関係なく同じままです。
私の質問は、重要なのは、変更されることから保護されていることを意味します。つまり、削除して別のものを辞書に追加しない限り、常に同じになりますか?
ありがとう。
解決
キーはそうです -copy
'dアイテムが設定されているとき、その後、それを変更することはできません。
辞書にエントリを追加する方法 - 初期化の一部(すべての辞書の場合)または変更中(可変辞書の場合) - 各キー引数をコピーします(キーは次に準拠する必要があります
NSCopying
プロトコル)およびコピーを辞書に追加します。対応する各値オブジェクトは、辞書が通過する前に扱われないことを確認するために、保持メッセージを受信します。
kcftedictionarykeykeycallbacksを使用してcfdictionaryを使用するか、次のアイテムを置き換えることができます。
id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];
他のヒント
使用してみてください NSMutableDictionary
, 、 代わりは。
辞書のコピーを作成して、キーをフィルタリングするにつれてフィルタリングできます。 KVCを使用してJSONからオブジェクトを登録する際に、ラクダケースとアンダースコア間を変換するためにこれを行います。私のリファクタリングライブラリを参照してください、 es_ios_utils, 、ソース用。 esnscategories.h 提供:
@interface NSMutableDictionary(ESUtils)
//Changes keys using keyFilter. If keyFilter generates duplicate non-unique keys, objects will be overwritten.
-(void)addEntriesFromDictionary:(NSDictionary*)d withKeyFilter:(NSString*(^)(NSString*))keyFilter;
...
したがって、すべてのキーを上品にするために、次のようなことができます。
NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count];
[md addEntriesFromDictionary:oldDictionary
withKeyFilter:^NSString*(NSString *key) {
return key.uppercaseString;
}];