Поиск NSString в NSSet

Как я могу найти определенную строку (значение) в NSSet?
Должно ли это быть сделано с использованием предикатов? Если да, то как?

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.

Ответ 1

От Сайт разработчика Apple:

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)

В этой статье от Ars Technica содержится дополнительная информация об использовании предикатов. Наконец Руководство Apple BNF для предикатов содержит информацию обо всех операциях, которые могут потребоваться.

Ответ 2

Строки равны, если их содержимое равно, поэтому вы можете просто сделать:

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

Использование NSPredicate здесь является излишним, потому что NSSet уже имеет метод -member: и метод -containsObject:.

Ответ 3

мог бы участник: работать здесь?

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

Ответ 4

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

Может или может не работать. Компилятор может создавать или не создавать разные объекты для одной и той же строки @"", поэтому я предпочел бы это сделать с предикатом MATHCES:

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