2011-07-03 41 views
10

Làm cách nào để tìm một chuỗi (giá trị) nhất định trong một NSSet?
Điều này có được thực hiện bằng cách sử dụng các biến vị ngữ không? Nếu vậy, làm thế nào?Tra cứu NSString trong 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]]; 

Bây giờ tôi muốn kiểm tra xem 'Chuỗi 2' có tồn tại trong bộ không.

Trả lời

6

Từ 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 chứa một số thông tin về việc sử dụng các vị từ. Cuối cùng, Apple's BNF guide for predicates chứa thông tin về mọi hoạt động mà người dùng có thể cần.

+0

Câu trả lời dưới đây là nhiều hơn những gì tôi mong đợi, nhưng cảm ơn bạn đã giới thiệu tôi đến NSPredicate! –

2

thành viên có thể làm việc ở đây không?

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

Strings đều bình đẳng nếu nội dung của họ đều bình đẳng, vì vậy bạn chỉ có thể làm:

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

Sử dụng một NSPredicate ở đây là quá mức cần thiết, bởi vì NSSet đã có một phương pháp -member: và một phương pháp -containsObject:.

+11

Nói đúng, không đúng là các chuỗi bằng nhau (theo nghĩa ANSI C) nếu nội dung của chúng bằng nhau. Các chuỗi bằng nhau nếu giá trị con trỏ của chúng bằng nhau. Tuy nhiên, đúng là bạn không cần một Predicate, bởi vì các phương thức '-member:' và '- containsObject:' không so sánh các đối tượng, nhưng gọi phương thức -isEqual: - trong trường hợp của NSStrings sẽ thực sự so sánh nội dung của đối tượng, không phải chính các đối tượng. – KPM

+10

@KPM ngoại trừ đây không phải là ANSI C, đây là Objective-C, trong đó lớp 'NSString' đã ghi đè phương thức' -isEqual: 'để thực hiện so sánh giống như' strcmp' giữa hai chuỗi. Vì vậy, nói đúng, hai dây là bình đẳng nếu nội dung của chúng bằng nhau. (Tôi không nói về sự giống nhau, đó là những gì bạn nhận được của hai con trỏ là như nhau) –

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

Có thể hoặc không hoạt động. Trình biên dịch có thể hoặc không thể tạo các đối tượng khác nhau cho cùng một @ "" chuỗi, vì vậy tôi thà làm điều đó với kết quả phù hợp ngữ:

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