Bất cứ ai cũng có thể chỉ cho tôi bất kỳ tài nguyên nào về so sánh không nhạy cảm trong trường hợp trong Mục tiêu C không? Nó dường như không có một phương pháp tương đương vớistr1.equalsIgnoreCase(str2)
Bất cứ ai cũng có thể chỉ cho tôi bất kỳ tài nguyên nào về so sánh không nhạy cảm trong trường hợp trong Mục tiêu C không? Nó dường như không có một phương pháp tương đương vớistr1.equalsIgnoreCase(str2)
Câu trả lời:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
Tài liệu được đặt tại Phương pháp tìm kiếm và so sánh
NSString
đó trả về một giá trị boolean. Sau đó, nếu chuỗi nhận là nil
, toàn bộ phương thức trả về NO
.
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
Lưu ý: stringA &&
là cần thiết vì khi stringA
là nil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
và vì vậy xảy ra NSOrderedSame
cũng được định nghĩa là 0
.
Ví dụ sau đây là một cạm bẫy điển hình:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
Một thay thế nếu bạn muốn kiểm soát nhiều hơn chỉ là trường hợp không nhạy cảm là:
[someString compare:otherString options:NSCaseInsensitiveSearch];
Tìm kiếm số và vô cảm dấu phụ là hai tùy chọn tiện dụng.
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
Bạn luôn có thể đảm bảo chúng trong cùng một trường hợp trước khi so sánh:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
Lợi ích chính là bạn tránh được vấn đề tiềm ẩn được mô tả bởi matm liên quan đến việc so sánh các chuỗi số không. Bạn có thể kiểm tra chuỗi không trước khi thực hiện một trong các compare:options:
phương thức hoặc bạn có thể lười biếng (như tôi) và bỏ qua chi phí bổ sung để tạo chuỗi mới cho mỗi so sánh (tối thiểu nếu bạn chỉ thực hiện một phương pháp hoặc hai so sánh).
caseInsensitiveCompare
), hãy luôn sử dụng nó.
Một cách mới để làm điều này. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
cho "Café" và "É", đây chắc chắn KHÔNG phải là một câu trả lời đúng.
Chuyển đổi câu trả lời của Jason Coco thành Swift cho sự lười biếng sâu sắc :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
NSMutableArray *arrSearchData;
NSArray *data=[arrNearByData objectAtIndex:i];
NSString *strValue=[NSString stringWithFormat:@"%@", [data valueForKey:@"restName"]];
NSRange r = [strValue rangeOfString:key options:NSCaseInsensitiveSearch];
if(r.location != NSNotFound)
{
[arrSearchData addObject:data];
}
@"Some String"
nhận được từ bất kỳ cuộc gọi khác và sẽ xảy ra lànil
, bạnif
sẽ cung cấp chotrue
như gửicaseInsensitiveCompare
tớinil
là hợp lệ và kết quả trong mộtnil
mà, trong trường hợp của chúng tôi, so vớiNSOrderedSame
sẽ trở lạitrue
(NSOrderedSame
được định nghĩa là 0). Đây có thể là một nguồn của các lỗi khá tàn phá, như trong trường hợp của tôi. Chúc mừng!