3

既存のオブジェクトを Cocoa のセットに追加することが実際にオブジェクトを置き換えるのか、それともaddObject:重複がある場合は単に無視するのかを理解するのに苦労しています。特定のフィールドが等しい場合、別のオブジェクトと同じと見なされるカスタム オブジェクトを使用しています。

isEqual:メソッドとhashメソッドの両方をオーバーライドしてcontainsObject:いて、呼び出すと戻りtrueますが、セットを新しいオブジェクトで更新したいのですが、何らかの理由で を呼び出すと機能しませんaddObject:

それを無視する場合NSMutableSet、望ましい効果を得るために代わりに使用するのに最適なデータ構造は何でしょうか?

4

4 に答える 4

15

説明から、重複があれば無視します。

指定されたオブジェクトがまだメンバーでない場合、そのオブジェクトをセットに追加します。

NSMutableSet を CFMutableSet にキャストできます。これには、オブジェクトの追加方法をより詳細に制御できるメソッドがあります (CFSetSetValue が必要です)。

  • CFSetSetValue : theSet に設定する。この値がすでにtheSetに存在する場合は、置き換えられます。

  • CFSetAddValue :がコレクションに既に存在する場合、この関数は何もせずに戻ります。

  • CFSetReplaceValue : この値がtheSetにまだ存在しない場合、関数は何もしません。

于 2012-09-28T20:01:12.033 に答える
1

NSMutableSet-addObject:メソッドは、テストに合格したオブジェクトを追加しない-member:ため、何もしません。

それでも新しいオブジェクトでセットを更新したい場合は、 をNSMutableArray呼び出して を使用でき-replaceObjectAtIndex:withObject:ます。

@interface NSMutableArray(JRAdditions) 
- (void)addUniqueObject:(id)object;
@end

@implementation NSMutableArray(JRAdditions) 
- (void)addUniqueObject:(id)object {
    NSUInteger existingIndex = [self indexOfObject:object];
    if(existingIndex == NSNotFound) {
       [self addObject:object];
       return;
    }
    [self replaceObjectAtIndex:existingIndex withObject:object];
}
@end
于 2012-09-28T20:02:06.137 に答える
0

何もせずに返します。NSMutableSetは無料で にブリッジされており、そのクラスのドキュメントCFMutableSetから:

value がコレクションに既に存在する場合、この関数は何もせずに戻ります。

于 2012-09-28T20:00:25.137 に答える