2011-07-03 29 views
10

NSSet'te belirli bir dizeyi (değer) nasıl bulabilirim?
Bu, yüklemler kullanılarak yapılabilir mi? Öyleyse nasıl?NSString araması

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]]; 

Şimdi sette 'String 2' olup olmadığını kontrol etmek istiyorum. Apple's Developer Site itibaren

cevap

6

:

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 yüklemler kullanma konusunda biraz daha bilgi içerir. Son olarak, Apple's BNF guide for predicates, birinin ihtiyaç duyabileceği tüm işlemler hakkında bilgi içerir.

+0

aşağıda cevap için umut ama beni tanıştırmak için teşekkür ederim daha ne olduğunu NSPredicate! –

2

üye olabilirsiniz: burada çalışmak? bunların içeriğini eşitse

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

dizeleri eşittir, bu nedenle tıpkı yapabilirsiniz:

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

burada NSPredicate kullanma NSSet zaten -member: yöntemi ve -containsObject: yöntemi olduğundan, overkill. Çalışabilir veya çalışmayabilir ya da çalışmayabilir.

+11

Kesin olarak, içeriklerinin eşit olması durumunda dizelerin eşit olduğu (ANSI C açısından) doğru değildir. İşaretçi değerleri eşitse dizeler eşittir. Bununla birlikte, bir Predicate'e ihtiyacınız yoktur, çünkü '-member:' ve '- includesObject:' yöntemleri nesneleri karşılaştırmaz, ancak NSStrings durumunda aslında -isEqual: yöntemini çağırır. Nesnelerin içeriğini değil, nesnelerin kendilerini karşılaştırır. – KPM

+10

@KPM bunun dışında ANSI C değil, bu, NSString sınıfının iki dizge arasında strcmp benzeri bir karşılaştırma yapmak için '-isEqual:' yöntemini geçersiz kıldığı Objective-C'dir. Bu yüzden kesinlikle konuşursak, iki dizginin içeriği eşit ise eşittir. (Ben özdeşlikten bahsetmiyorum, iki işaretçiden elde ettiğiniz şey aynıdır) –

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

derleyici veya "" @ aynı dizesi farklı nesneler oluşturmak olmayabilir, bu yüzden oldukça eşleşmeler yüklemi yapacağını:

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