8

私は2つのNSDictionariesを数時間マージしようとしています。検索して、使用できることがわかりました[NSMutableDictionary addEntriesFromDictionary:]

    NSDictionary *areaAttributes = [[area entity] attributesByName];
    NSDictionary *gpsAttributes = [[gps entity] attributesByName];

    NSMutableDictionary *areaAttributesM = [areaAttributes mutableCopy];
    NSMutableDictionary *gpsAttributesM = [gpsAttributes mutableCopy];

    NSMutableDictionary *combinedAttributes =  [areaAttributesM addEntriesFromDictionary:gpsAttributesM];

しかし、エラーが発生します:

Initializing 'NSMutableDictionary *_strong' with an expression of incompatible type 'void'

[areaAttributesM addEntriesFromDictionary:gpsAttributesM]だからこれはそれが戻ると言っていますvoidか?私の理解は正しいですか?そして、なぜそれは無効を返すのですか?

4

2 に答える 2

13

はい。それで合っています。ドキュメントから:

- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary

理由は簡単です。Cocoaの所定の場所にあるオブジェクトを変更する関数は通常voidを返すため、別のオブジェクトを返す関数と簡単に区別できます。

mutableCopyまた、gpsAttributes辞書に理由はありません。の引数として使用されているだけで-[addEntriesFromDictionary:]あり、変更可能である必要はありません。

したがって、これを行う正しい方法は次のとおりです。

NSDictionary *areaAttributes = [[area entity] attributesByName];
NSDictionary *gpsAttributes = [[gps entity] attributesByName];

NSMutableDictionary *combinedAttributes = [areaAttributes mutableCopy];
[combinedAttributes addEntriesFromDictionary:gpsAttributes];

NSDictionary頻繁に行う場合は、これを関数(またはのカテゴリのメソッド)にまとめることができます。

NSDictionary *mergeDictionaries(NSDictionary *lhs, NSDictionary *rhs) {
    NSMutableDictionary *ret = [lhs mutableCopy];
    [ret addEntriesFromDictionary:rhs];
    return ret;
}
于 2013-01-14T23:13:23.367 に答える