NSString perbandingan kasus sensitif


Jawaban:


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

Dokumentasi ini terletak di Metode Pencarian dan Perbandingan


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
 }

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.


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).


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

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

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

6

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

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}

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


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()){
}

0

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

if ([@"Test" isCaseInsensitiveLike: @"test"])
    // Success

-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];
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.