NSString perbandingan kasus sensitif

240

Adakah yang bisa mengarahkan saya ke sumber daya apa pun tentang perbandingan kasus sensitif di Objective C? Tampaknya tidak memiliki metode yang setarastr1.equalsIgnoreCase(str2)

Tejaswi Yerukalapudi
sumber

Jawaban:

564
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
  // strings are equal except for possibly case
}

Dokumentasi ini terletak di Metode Pencarian dan Perbandingan

Jason Coco
sumber
152
Perlu disebutkan bahwa dalam kasus ketika @"Some String"diterima dari panggilan lain dan kebetulan nil, Anda ifakan memberikan truesebagai pengiriman caseInsensitiveCompareke nilvalid dan menghasilkan yang lain nil, dalam kasus kami, dibandingkan dengan NSOrderedSameakan kembali true( NSOrderedSamedidefinisikan sebagai 0). Ini bisa menjadi sumber bug yang sangat menghancurkan, seperti dalam kasus saya. Bersulang!
matm
10
Solusi saya untuk ini adalah menerapkan perbandingan itu sebagai metode di dalam kategori NSStringyang mengembalikan boolean. Kemudian jika string penerima nil, metode secara keseluruhan kembali NO.
Defragged
50
 NSString *stringA;
 NSString *stringB;

 if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
     // match
 }

Catatan: stringA && diperlukan karena ketika stringAadalah nil:

 stringA = nil;
 [stringA caseInsensitiveCompare:stringB] // return 0

dan yang terjadi NSOrderedSamejuga didefinisikan sebagai 0.

Contoh berikut adalah perangkap khas:

 NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
 if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
     // what happens if "Rank" is not found in standardUserDefaults
 }
ohho
sumber
46

Alternatif jika Anda ingin kontrol lebih dari sekadar ketidakpekaan kasus adalah:

[someString compare:otherString options:NSCaseInsensitiveSearch];

Pencarian numerik dan ketidakpekaan diakritik adalah dua pilihan praktis.

ditarik ke depan
sumber
4
Seperti disebutkan di atas oleh matm, ini akan mengembalikan true jika someString adalah nihil.
nh32rg
@ nh32rg Bisakah Anda mengganti kesalahan positif, dengan mengubah if-statement ke sesuatu sepertiif ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon
1
sebenarnya, Anda perlu menulis [... comapre: ...] == 0, karena bandingkan return NSOrderSame (= 0) jika dua string sama. untuk, someString! = (id) [NSNull null], saya tidak berpikir itu diperlukan, karena jika nol, maka, panjangnya adalah nol. Saya biasanya membandingkan seperti ini: if (someString.length> 0 && [someString bandingkan: ortherString options: NSCaseIntensitiveSearch] == 0)
Tran Quan
23

Anda selalu dapat memastikan bahwa mereka berada dalam kasus yang sama sebelum perbandingan:

if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
    // They're equal
}

Manfaat utama adalah Anda menghindari masalah potensial yang dijelaskan oleh matm tentang membandingkan string nil Anda bisa memeriksa string tidak nol sebelum melakukan salah satu compare:options:metode, atau Anda bisa malas (seperti saya) dan mengabaikan biaya tambahan untuk membuat string baru untuk setiap perbandingan (yang minimal jika Anda hanya melakukan satu atau dua perbandingan).

Chris Wooden
sumber
3
Memanipulasi casing untuk membandingkan biasanya bukan hal yang bijaksana untuk dilakukan (misalnya, tes kalkun: moserware.com/2008/02/does-your-code-pass-turkey-test.html ). Ketika Anda memiliki perbandingan kasus yang didukung bahasa (seperti caseInsensitiveCompare), selalu gunakan itu.
Ohad Schneider
7
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Angin puyuh
sumber
12
Ini jauh lebih berguna bagi orang-orang jika jawaban memiliki konteks dan deskripsi.
jowie
7

Cara baru untuk melakukan ini. iOS 8

let string: NSString = "Café"
let substring: NSString = "É"

string.localizedCaseInsensitiveContainsString(substring) // true
Govind
sumber
versi objC: if (string && [string localizedCaseInsensitiveContainsString: substring])
ski_squaw
OP meminta "perbandingan tidak sensitif huruf" . Jika solusi Anda kembali trueuntuk "Café" dan "É", ini jelas BUKAN jawaban yang benar.
Alexander Abakumov
6

Coba metode ini

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Reena
sumber
6

Mengonversi jawaban Jason Coco ke Swift untuk orang yang sangat malas :)

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}
Tasik
sumber
1
itu dibutuhkan untuk mereka yang Xcode menolak untuk melengkapi otomatis! : D
Nitin Alabur
5

untuk memeriksa dengan awalan seperti pada iPhone ContactApp

([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)

ini blog berguna bagi saya

iMeMyself
sumber
1

Solusi alternatif untuk cepat:

Untuk membuat kedua Huruf Besar:

misalnya:

if ("ABcd".uppercased() == "abcD".uppercased()){
}

atau untuk membuat LowerCase:

misalnya:

if ("ABcd".lowercased() == "abcD".lowercased()){
}
FARAZ
sumber
0

Pada macOS Anda cukup menggunakan -[NSString isCaseInsensitiveLike:], yang mengembalikan BOOLseperti -isEqual:.

if ([@"Test" isCaseInsensitiveLike: @"test"])
    // Success
mangerlahn
sumber
-3
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];
}
abc
sumber