2

私のコードは次のようになります:

NSPredicate* pred = [NSPredicate predicateWithFormat:@"(title IN %@)", prev_set];
NSSet* remainingSet = [goal_set filteredSetUsingPredicate:pred ];

prev_set と goal_set は 2 つの異なるセットです。両方のセットに含まれるオブジェクトのプロパティの「タイトル」。

私の目的は、以前に達成されたすべての目標が拒否されるようにすることです (各目標には固有のタイトルがあります)。

「title in %@」のような述語がある場合、goal_set 内のすべてのオブジェクトが拒否されます。"NOT("title in %@)" を使用すると、goal_set のオブジェクトはどれも拒否されません。

両方のセットを印刷すると、いくつかの (すべてではない) オブジェクトが明らかに共通していることがわかります (つまり、タイトルが同じです)。

NSPredicates の「IN」の使用について完全に混乱していますか? どうすれば目的を達成できますか?

4

2 に答える 2

1

試してみてください[NSPredicate predicateWithFormat:@"NOT (title IN %@.title)", prev_set]

述語はオブジェクトがprev_set含まれていると想定していますが、説明によると、文字列プロパティを持つオブジェクトが含まれているため、タイトル自体が含まれることはありません。それが理にかなっていることを願っています。NSString

于 2013-08-08T00:50:04.857 に答える
0

A定義により、2 つの集合とBからの交点を取り除くことは、A における BA相対的補数A \ Bであり、集合差とも呼ばれます。

幸いNSMutableSetなことに、必要なセット操作が特徴です。つまり、minusSet:

NSMutableSet *mutableGoalSet = [goal_set mutableCopy];
[mutableGoalSet minusSet:prev_set];

もちろん、これが機能するには、目標オブジェクトのメソッドを実装して、タイトルで識別できるようにする必要がありますisEqualhash(関連: isEqual: および hash をオーバーライドするためのベスト プラクティス)

于 2013-08-08T00:40:16.477 に答える