2011-11-15 38 views
14

Tôi đang làm việc trên một ứng dụng kiểm tra một mảng để xem nó có chứa một chuỗi nhất định hay không. Tuy nhiên, nó không có vẻ là làm việc đúng, bởi vì tôi nghĩ rằng nó có thể được xem xét trường hợp của chuỗi. Trong dòng mã này, làm cách nào để đảm bảo rằng chứaObject: đang phân biệt chữ hoa chữ thường?không phân biệt chữ hoa chữ thường trong NSArray chứaObject:

if ([myArray containsObject:term]) {...} 

Vui lòng hỏi xem bạn có cần làm rõ và nhờ sự giúp đỡ của bạn không.

(Ngoài ra, tôi đã tìm thấy câu hỏi này: Case insensitive comparison NSString Tôi không biết nếu điều này là những gì tôi cần, và nếu nó là, làm thế nào tôi sẽ sử dụng nó.)

Trả lời

6

NSArray là (cố tình) không biết gì về những gì nó nắm giữ. Vì vậy, nó không phải là nhận thức của NSString, ít hơn nhiều về trường hợp nhạy cảm. Bạn sẽ phải lặp qua các mục của mảng và so sánh chúng. Bạn có thể sử dụng một trong nhiều cách khác nhau để lặp qua mảng:

  • objectEnumerator
  • indexOfObjectPassingTest: trong đó sử dụng các khối để thực hiện thao tác của bạn.
  • gọi objectAtIndex: cho mỗi mục.

Tôi sẽ đề xuất một trong 2 tùy chọn đầu tiên.

+0

tôi sẽ phải xem xét điều này khi tôi có cơ hội. Cảm ơn! – thekmc

24
if ([myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
     return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame); 
    }] != NSNotFound) { 
    // there's at least one object that matches term case-insensitively 
} 
0
- (BOOL)containsObject:(id)anObject 

là phương pháp tiện lợi mà bạn không thể áp dụng cho mục đích của mình. Dưới đây là các cuộc thảo luận tài liệu:

Phương pháp này sẽ xác định xem anObject hiện diện trong mảng bằng cách gửi isEqual: thông điệp cho mỗi đối tượng của mảng (và qua anObject như các tham số cho mỗi isEqual: message).

Phương pháp chung của NSObject isEqual: không thể thực hiện để xem xét trường hợp của các ký tự chuỗi. Các giải pháp tốt nhất nếu bạn có thể sử dụng các khối (iOS 4) có lẽ là một cái gì đó giống như đề xuất của Kevin Ballard. Nếu không thì bạn có thể phải lặp qua các chuỗi.

-1
if ([@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame) { 
    //... 
} 

này có thể hữu ích cho bạn ... Tất cả tốt nhất

14

Dưới đây là một cách tiếp cận hiệu quả sử dụng khóa-giá trị mã hóa.

NSArray *strings; // array of strings 
if ([[strings valueForKey:@"lowercaseString"] containsObject:[searchString lowercaseString]]) { 
    NSLog(@"searchString found"); 
} else { 
    NSLog(@"searchString NOT found"); 
} 

Swift 3 Option:

let things = ["foo", "Bar"] 
let searchString = "FOO" 

if things.contains(where: { $0.lowercased() == searchString.lowercased() }) { 
    print("found searchString") 
} else { 
    print("searchString not found") 
} 
Các vấn đề liên quan