2010-11-07 76 views
3

我試圖確定兩個NSSets是否「相等」,但不是isEqualToSet。兩組中的項目是相同的類,但不是相同的對象,或者甚至是對同一對象的引用。他們有一個屬性是相同的,但我們稱之爲'名稱'。單個屬性比較NSSets

我最好在比較這兩組來做一個簡單的集合計數測試,然後一個更復雜的objectsPassingTest:在一個集合中的每個項目上,確保具有相同名稱的項目在另一個集合中?我希望有更簡單的辦法來處理這種情況。

回答

2

您可以在兩組上都調用valueForKey:並比較結果。

if ([[set1 valueForKey:@"name"] isEqualToSet:[set2 valueForKey:@"name"]]) { 
    // the sets match your criteria 
} 
+0

哇,這太簡單了。調用valueForKey:在具有屬性的NSSet上返回一組對象,該對象是原始內容的鍵控屬性。 – Nick 2010-11-07 16:39:22

0

通過文檔查看,似乎沒有辦法真正處理你的這種特殊情況。你將不得不編寫一些自定義代碼來處理這個問題。就個人而言,我會建議使用-sortedArrayUsingDescriptors:,然後比較陣列,但這只是我。你也可以通過一組枚舉,然後使用-filteredSetUsingPredicate:縮小另一個,並得到它的count

無論您使用哪種方法,都要考慮其可能不會超高效的事實。這可能是不可避免的,但是可能有些方法可以比其他方法更好。食物的思想。

3

我有同樣的問題,但我需要多個屬性的同時比較(類用戶與性能名稱標識)。

我解決了這個通過添加返回一個的NSDictionary所需要的類屬性的方法:

- (NSDictionary *)itemProperties 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    [dict setObject:self.name forKey:@"name"]; 
    [dict setObject:self.id forKey:@"id"]; 
    return dict; 
} 

,然後使用valueForKey:凱文·巴拉德提到:

BOOL userSetsEqual = [[userSet1 valueForKey:@"itemProperties"] 
    isEqualToSet:[userSet2 valueForKey:@"itemProperties"]]; 

...其中userSet1和userSet2是包含用戶對象的NSSets。