2011-07-03 51 views
10

如何在NSSet中找到某個字符串(值)?
這個必須使用謂詞來完成嗎?如果是這樣,怎麼樣?NSSet中的NSString查找

NSMutableSet *set = [[NSMutableSet alloc] init]; 
[set addObject:[[[NSString alloc] initWithFormat:@"String %d", 1] autorelease]]; 
[set addObject:[[[NSString alloc] initWithFormat:@"String %d", 2] autorelease]]; 
[set addObject:[[[NSString alloc] initWithFormat:@"String %d", 3] autorelease]]; 

現在我想檢查'String 2'是否存在於集合中。

回答

6

Apple's Developer Site

NSSet *sourceSet = [NSSet setWithObjects:@"One", @"Two", @"Three", @"Four", nil]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith 'T'"]; 
NSSet *filteredSet = [sourceSet filteredSetUsingPredicate:predicate]; 
// filteredSet contains (Two, Three) 

This article from Ars Technica包含使用謂詞一些更多的信息。最後,Apple's BNF guide for predicates包含有關可能需要的所有操作的信息。

+0

下面的答案更是我希望的,不過還是謝謝你把我介紹給NSPredicate! –

2

可能會員:在這裏工作嗎?

member: 
Determines whether the set contains an object equal to a given object, and returns that object if it is present. 

- (id)member:(id)object 
Parameters 
object 
The object for which to test for membership of the set. 
Return Value 
If the set contains an object equal to object (as determined by isEqual:) then that object (typically this will be object), otherwise nil. 

Discussion 
If you override isEqual:, you must also override the hash method for the member: method to work on a set of objects of your class. 

Availability 
Available in iOS 2.0 and later. 
Declared In 
NSSet.h 
43

字符串相等,如果它們的內容是平等的,所以你可以這樣做:

NSSet *set = [NSSet setWithObjects:@"String 1", @"String 2", @"String 3", nil]; 
BOOL containsString2 = [set containsObject:@"String 2"]; 

使用的NSPredicate這裏是矯枉過正,因爲NSSet已經有一個-member:方法和-containsObject:方法。

+11

嚴格來說,如果字符串的內容相同,那麼字符串是不相同的(在ANSI C的意義上)。如果指針值相等,則字符串相等。不過,確實你不需要謂詞,因爲'-member:'和' - containsObject:'方法不會比較對象,而是調用-isEqual:方法 - 在NSStrings的情況下,它實際上會比較對象的內容,而不是對象本身。 – KPM

+10

@KPM除了這不是ANSI C,這是Objective-C,其中'NSString'類已經重寫了'-isEqual:'方法來對兩個字符串進行類似strcmp的比較。所以嚴格來說,如果內容相同,兩個字符串是相等的。 (我不是在說同一性,這是你得到的兩個指針是一樣的) –

1
NSSet *set = [NSSet setWithObjects:@"String 1", @"String 2", @"String 3", nil]; 
BOOL containsString2 = [set containsObject:@"String 2"];

可能會或可能無法正常工作。編譯器可能會或可能不會爲同創建不同的對象@「」字符串,所以我寧願符合項目謂語做到這一點:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"String 2"];