ทุกคนสามารถบอกฉันถึงแหล่งข้อมูลใด ๆ เกี่ยวกับการเปรียบเทียบแบบคำนึงถึงขนาดตัวพิมพ์ใน Objective C ได้หรือไม่? ดูเหมือนจะไม่มีวิธีเทียบเท่าstr1.equalsIgnoreCase(str2)
ทุกคนสามารถบอกฉันถึงแหล่งข้อมูลใด ๆ เกี่ยวกับการเปรียบเทียบแบบคำนึงถึงขนาดตัวพิมพ์ใน Objective C ได้หรือไม่? ดูเหมือนจะไม่มีวิธีเทียบเท่าstr1.equalsIgnoreCase(str2)
คำตอบ:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
เอกสารอยู่ที่วิธีการค้นหาและการเปรียบเทียบ
NSString
ที่ส่งกลับบูลีน แล้วถ้าสตริงที่ได้รับเป็นวิธีการที่เป็นผลตอบแทนทั้งหมดnil
NO
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
หมายเหตุ: stringA &&
ไม่จำเป็นต้องมีเพราะเมื่อstringA
เป็นnil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
และอื่น ๆ ที่เกิดขึ้นNSOrderedSame
ก็นิยามไว้เช่น0
กันว่า
ตัวอย่างต่อไปนี้เป็นข้อผิดพลาดทั่วไป:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
อีกทางเลือกหนึ่งถ้าคุณต้องการการควบคุมที่มากกว่าความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คือ:
[someString compare:otherString options:NSCaseInsensitiveSearch];
การค้นหาเชิงตัวเลขและการตอบโต้แบบไม่ออกเสียงเป็นสองตัวเลือกที่มีประโยชน์
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
คุณสามารถมั่นใจได้ว่าพวกเขาอยู่ในกรณีเดียวกันเสมอก่อนการเปรียบเทียบ:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
ประโยชน์หลักที่คุณหลีกเลี่ยงปัญหาที่อาจเกิดขึ้นที่อธิบายโดย matm เกี่ยวกับการเปรียบเทียบสตริงไม่มี คุณสามารถตรวจสอบว่าสตริงไม่ได้เป็นศูนย์ก่อนที่จะทำcompare:options:
วิธีใดวิธีหนึ่งหรือคุณอาจจะขี้เกียจ (อย่างฉัน) และไม่สนใจค่าใช้จ่ายเพิ่มเติมในการสร้างสตริงใหม่สำหรับการเปรียบเทียบแต่ละครั้ง หรือสองการเปรียบเทียบ)
caseInsensitiveCompare
) ใช้มันเสมอ
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
วิธีใหม่ในการทำเช่นนี้ iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
เป็น "คาเฟ่" และ "É" นี่ไม่ใช่คำตอบที่ถูกต้องแน่นอน
ลองวิธีนี้
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
แปลงคำตอบของ Jason Coco ให้Swiftเพื่อคนขี้เกียจอย่างสุดซึ้ง :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
เพื่อตรวจสอบกับคำนำหน้าเช่นเดียวกับใน iPhone ContactApp
([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
นี้บล็อกมีประโยชน์สำหรับฉัน
โซลูชันสำรองสำหรับ swift:
ในการสร้างทั้งสองกรณี:
เช่น:
if ("ABcd".uppercased() == "abcD".uppercased()){
}
หรือทำทั้ง LowerCase:
เช่น:
if ("ABcd".lowercased() == "abcD".lowercased()){
}
ใน macOS คุณสามารถใช้งาน-[NSString isCaseInsensitiveLike:]
ได้ซึ่งจะให้ผลตอบแทนBOOL
เหมือน-isEqual:
กัน
if ([@"Test" isCaseInsensitiveLike: @"test"])
// Success
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"
ได้รับจากการโทรอื่น ๆ และเกิดขึ้นเป็นnil
คุณif
จะให้true
การส่งcaseInsensitiveCompare
ไปnil
เป็นที่ถูกต้องและผลลัพธ์ในการอื่นnil
ซึ่งในกรณีของเราเมื่อเทียบกับNSOrderedSame
จะกลับtrue
(NSOrderedSame
ถูกกำหนดเป็น 0) นี่อาจเป็นแหล่งที่มาของโรคจิตที่ร้ายแรงอย่างที่เคยเป็นในกรณีของฉัน ไชโย!