Bagaimana saya menguji jika string kosong di Objective-C?

651

Bagaimana cara menguji jika NSStringkosong di Objective-C?

Jamey McElveen
sumber

Jawaban:

1156

Anda dapat memeriksa apakah [string length] == 0. Ini akan memeriksa apakah itu string yang valid tetapi kosong (@ "") serta apakah nihil, karena memanggil lengthnil juga akan mengembalikan 0.

Marc Charbonneau
sumber
12
Ada beberapa NSStrings yang sangat langka di mana ini akan menghasilkan false negative (mengatakan string tidak kosong, ketika, untuk tujuan praktis, itu). Pertimbangkan @"\u200B"(hanya terdiri dari karakter Unicode ZERO WIDTH SPACE . Mencetaknya akan mencetak 0 karakter (memverifikasi menggunakan font monospace), tetapi string.length akan memberikan 1. Ada karakter Unicode lainnya (seperti KARAKTER PENGGANTI OBYEK ) yang berperilaku sama. Anda dapat dapatkan yang terakhir saat
mem-
43
@ fzwo tidak menjadi keledai, tetapi secara teori itu tidak memberikan negatif palsu. Berperilaku tepat seperti yang Anda harapkan. Penafsiran Anda tentang apa ZERO WIDTH SPACEyang tidak terlalu penting, karena @"\u200B" merupakan karakter tetap jadi jika Anda menguji untuk string menjadi kosong, itu akan mengatakan itu bukan karena ada karakter di dalamnya. Hanya saja tidak dapat dicetak mengikuti standar Unicode.
bmeulmeester
2
Tentu saja secara teknis benar, saya tidak memperdebatkannya. Saya hanya ingin mengingatkan bahwa ini mungkin tidak menunjukkan perilaku yang dimaksudkan atau diharapkan, itulah sebabnya saya menulis "untuk tujuan praktis". Itu tergantung pada makna yang dimaksud "kosong".
fzwo
4
Itu bukan negatif palsu. "Ruang bernilai nol" adalah karakter unicode seperti yang lainnya. Hanya "layak diingat" jika relevan dengan aplikasi Anda. (Pemikiran yang bagus, fzwo!)
Fattie
2
Beritahu saya jika saya salah, tapi saya pikir Anda juga bisa omit == 0 bagian dan menambahkan negasi di depan: ![string length]. Tampak lebih bersih.
damirstuhec
126

Jawaban Marc benar. Tapi saya akan mengambil kesempatan ini untuk memasukkan pointer ke generalisasi Wil Shipley isEmpty, yang dibagikannya di blog - nya :

static inline BOOL IsEmpty(id thing) {
return thing == nil
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
Matt G
sumber
26
Jika Anda ingin ini menjadi sangat umum, seseorang dapat mengimplementasikan logika ini sebagai kategori pada NSObject daripada menggunakan metode statis seperti yang ditunjukkan di sini.
Brad The App Guy
16
Anehnya, ini tidak benar-benar memeriksa [NSNull null].
Peter N Lewis
14
Jika Anda berada dalam situasi di mana Anda tidak tahu jenis objek apa yang Anda periksa, saya kira ini berfungsi. Namun saya menyarankan bahwa jika Anda tidak tahu apakah suatu objek NSData atau NSArray, Anda memiliki masalah yang lebih besar. Apa makro Anda selanjutnya setelah panggilan ini, condenseToSingleNSData (hal id)? perluasToNSArray (hal id)? Cepat atau lambat, Anda akan bertanya kelas apa yang Anda hadapi, lebih baik melakukannya dengan referensi pertama.
Brane
1
@BradSmith, orang dapat membuat kategori untuk itu tetapi nilai nil tidak akan dihitung karena metode tidak akan dipanggil. Misalnya, jika thing = nil, [thing IsEmpty] tidak akan dipanggil dan akan selalu kembali false / NO. Untuk memeriksa nil, perlu ada parameter. Objek nil tidak dapat membandingkan dirinya sebagai nihil melalui kategori.
Chris
3
@chris maka Anda dapat mengubah metode kategori ke -isNotEmpty:)
nielsbot
93

Pendekatan pertama valid, tetapi tidak berfungsi jika string Anda memiliki spasi kosong ( @" "). Jadi, Anda harus menghapus spasi putih ini sebelum mengujinya.

Kode ini menghapus semua ruang kosong di kedua sisi string:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

Satu ide bagus adalah membuat satu makro, jadi Anda tidak perlu mengetikkan garis monster ini:

#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]

Sekarang Anda dapat menggunakan:

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
Tim Pengembangan SEQOY
sumber
3
Mengapa menggunakan makro saat itu tidak diperlukan? Dalam hal ini keselamatan jenis apa pun dikorbankan tanpa manfaat nyata.
EM
Adalah untuk kenyamanan sederhana, jika Anda suka menulis "[objek stringTarik stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]" "setiap kali Anda ingin memeriksa apakah satu string kosong, terserah Anda.
Tim Pengembangan SEQOY
18
yang lebih baik dilayani oleh NSStringkategori yang menambahkan metode yang disebut trimmedStringyang melakukan persis apa yang Anda tulis.
Dave DeLong
2
Perhatikan bahwa Apple whitespaceCharacterSettidak termasuk baris baru! Berikut adalah kategori yang saya tulis termasuk trimdan beberapa metode berguna lainnya: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
AlexChaffee
@ EM Saya bukan penggemar makro, tetapi saya tidak mengerti masalah keamanan jenis Anda. Selama kompilasi makro diganti dengan isinya jadi jika Anda memanggil makro dengan sesuatu yang berbeda dari NSString Anda masih mendapatkan pesan dari kompiler. Kategori akan jauh lebih baik.
Zmaster
32

Salah satu solusi terbaik yang pernah saya lihat (lebih baik daripada Matt G) adalah fungsi inline yang ditingkatkan ini saya ambil pada beberapa repo Git Hub (yang milik Wil Shipley, tetapi saya tidak dapat menemukan tautannya):

// Check if the "thing" passed is empty
static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}
rampok
sumber
2
Ini adalah karya Wil Shipley. FYI, Anda dapat mengubah [thing isKindOfClass: [NSNull class]] menjadi just (thing == [NSNull null])
Steve N
Fiuh .... persis apa yang saya cari. Saya menjadi gila, mencoba mencari tahu mengapa fungsi "cellForRowAtIndexPath" saya mogok karena string nol (dan saya tidak bisa menangkap masalah). Fungsi ini menyelesaikannya dengan sempurna.
Mike Gledhill
Salinan komentar @Brane: Jika Anda berada dalam situasi di mana Anda tidak tahu jenis objek apa yang Anda periksa, saya kira ini berfungsi. Namun saya menyarankan bahwa jika Anda tidak tahu apakah suatu objek NSData atau NSArray, Anda memiliki masalah yang lebih besar. Apa makro Anda selanjutnya setelah panggilan ini condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Cepat atau lambat, Anda akan bertanya kelas apa yang Anda hadapi, lebih baik melakukannya dengan referensi pertama.
Cœur
16

Anda sebaiknya menggunakan kategori ini:

@implementation NSString (Empty)

    - (BOOL) isWhitespace{
        return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
    }

@end
Cur
sumber
6
Definisi itu akan menyimpulkan bahwa string "/ r / n / r / n" kosong, ketika jelas tidak - itu berisi spasi. Fungsi Anda benar-benar: - (BOOL) isWhitespace (NSString *);
JBRWilkinson
6
Konsekuensi dari ini. Saya menerapkan kategori ini, dan ada twist. Jika Anda menyebut ini pada string nil, fungsi ini tidak pernah dipanggil, dan Anda mendapatkan kembali TIDAK (atau apa yang dievaluasi menjadi TIDAK) sebagai nilai balik. Maka Anda pikir itu tidak kosong ... Ini mungkin berfungsi jika namanya isFilled atau sesuatu seperti itu.
Ying
Saya kira kategori yang tepat adalah: @implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end Sebagai kombinasi jawaban Marc dan Kyle.
Palme
12

Saya menempatkan ini:

@implementation NSObject (AdditionalMethod)
-(BOOL) isNotEmpty
{
    return !(self == nil
    || [self isKindOfClass:[NSNull class]]
    || ([self respondsToSelector:@selector(length)]
        && [(NSData *)self length] == 0)
    || ([self respondsToSelector:@selector(count)]
        && [(NSArray *)self count] == 0));

};
@end

Masalahnya adalah jika self nil, fungsi ini tidak pernah dipanggil. Ini akan mengembalikan false, yang diinginkan.

pengguna4951
sumber
solusi terbaik karena a) adalah metode instance dan b) kategori c) kasus nil dengan sendirinya ditangani oleh 'isNotEmpty' Thx!
Denis
Ide bagus, terlalu buruk -(BOOL)isEmpty{ return ![self isNotEmpty]}tidak akan bekerja pada kategori.
Alston
Salinan komentar @Brane: Jika Anda berada dalam situasi di mana Anda tidak tahu jenis objek apa yang Anda periksa, saya kira ini berfungsi. Namun saya menyarankan bahwa jika Anda tidak tahu apakah suatu objek NSData atau NSArray, Anda memiliki masalah yang lebih besar. Apa makro Anda selanjutnya setelah panggilan ini condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Cepat atau lambat, Anda akan bertanya kelas apa yang Anda hadapi, lebih baik melakukannya dengan referensi pertama.
Cœur
11

Pilihan lain adalah memeriksa apakah sama @""dengan isEqualToString:seperti:

if ([myString isEqualToString:@""]) {
    NSLog(@"myString IS empty!");
} else {
    NSLog(@"myString IS NOT empty, it is: %@", myString);
}
dikunyah
sumber
11

Cukup berikan string Anda ke metode berikut:

+(BOOL)isEmpty:(NSString *)str
{
    if(str.length==0 || [str isKindOfClass:[NSNull class]] || [str isEqualToString:@""]||[str  isEqualToString:NULL]||[str isEqualToString:@"(null)"]||str==nil || [str isEqualToString:@"<null>"]){
        return YES;
    }
    return NO;
}
Mani
sumber
Lihat komentar di stackoverflow.com/questions/21605075/… untuk alasan ini salah. Juga bagaimana ini lebih baik daripada jawaban lain di sini.
Popeye
6

Cukup gunakan salah satu if elsekondisi seperti yang ditunjukkan di bawah ini:

Metode 1:

if ([yourString isEqualToString:@""]) {
        // yourString is empty.
    } else {
        // yourString has some text on it.
    }

Metode 2:

if ([yourString length] == 0) {
    // Empty yourString
} else {
    // yourString is not empty
}
Samir Jwarchan
sumber
6

Versi Swift

Meskipun ini adalah pertanyaan Objective C, saya perlu menggunakan NSStringSwift jadi saya juga akan memasukkan jawaban di sini.

let myNSString: NSString = ""

if myNSString.length == 0 {
    print("String is empty.")
}

Atau jika NSStringOpsional:

var myOptionalNSString: NSString? = nil

if myOptionalNSString == nil || myOptionalNSString!.length == 0 {
    print("String is empty.")
}

// or alternatively...
if let myString = myOptionalNSString {
    if myString.length != 0 {
        print("String is not empty.")
    }
}

Versi Swift normal Stringadalah

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
}

Lihat juga: Periksa string kosong di Swift?

Suragch
sumber
5

Mungkin jawaban ini adalah duplikat dari jawaban yang sudah diberikan, tetapi saya melakukan sedikit modifikasi dan perubahan dalam urutan memeriksa kondisi. Silakan merujuk kode di bawah ini:

+(BOOL)isStringEmpty:(NSString *)str
    {
        if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
            return YES;
       }
        return NO;
    }
iDevAmit
sumber
Ini adalah kategori, Anda dapat melihat cara membuatnya di sini: goo.gl/bRcfn7 . Saya suka ide untuk kategori ini
Daniel Gomez Rico
Tidak, kami tidak dapat mengatakan ini adalah kategori. Jika fungsi ini diimplementasikan di bawah kategori kelas NSString, maka itu adalah kategori. Kalau tidak, kita dapat memanggil metode ini dengan nama kelas di mana pun kita menerapkannya. Seperti Bool isEmptyStr = [MyClassName isStringEmpty: str] Namun, akan lebih baik jika kita mendeklarasikannya dalam kategori. Karena entah bagaimana kita juga perlu memanfaatkan kategori.
iDevAmit
4

Anda dapat memeriksa apakah string Anda kosong atau tidak saya menggunakan metode ini:

+(BOOL) isEmptyString : (NSString *)string
{
    if([string length] == 0 || [string isKindOfClass:[NSNull class]] || 
       [string isEqualToString:@""]||[string  isEqualToString:NULL]  ||
       string == nil)
     {
        return YES;         //IF String Is An Empty String
     }
    return NO;
}

Praktik terbaik adalah membuat kelas bersama mengatakan UtilityClass dan iklankan metode ini sehingga Anda dapat menggunakan metode ini dengan hanya memanggilnya melalui aplikasi Anda.

Fatima Arshad
sumber
4

Anda memiliki 2 metode untuk memeriksa apakah string kosong atau tidak:

Misalkan nama string Anda NSString *strIsEmpty.

Metode 1:

if(strIsEmpty.length==0)
{
    //String is empty
}

else
{
    //String is not empty
}

Metode 2:

if([strIsEmpty isEqualToString:@""])
{
    //String is empty
}

else
{
    //String is not empty
}

Pilih salah satu dari metode di atas dan ketahui apakah string kosong atau tidak.

Aditya
sumber
3

Cukup Periksa panjang string Anda

 if (!yourString.length)
 {
   //your code  
 }

pesan ke NIL akan mengembalikan nol atau 0, jadi tidak perlu menguji nil :).

Selamat coding ...

Aks
sumber
Saya sudah sering menggunakan ini. Sama sekali tidak perlu untuk ekstensi, kategori dan apa yang tidak.
pnizzle
2

Ini berfungsi sebagai pesona bagi saya

Jika NSStringinis

if ([s isKindOfClass:[NSNull class]] || s == nil || [s isEqualToString:@""]) {

    NSLog(@"s is empty");

} else {

    NSLog(@"s containing %@", s);

}
MaxEcho
sumber
2

Jadi selain dari konsep dasar untuk memeriksa panjang string kurang dari 1, penting untuk mempertimbangkan konteks secara mendalam. Bahasa manusia atau komputer atau yang lain mungkin memiliki definisi string kosong yang berbeda dan dalam bahasa yang sama, konteks tambahan selanjutnya dapat mengubah maknanya.

Katakanlah string kosong berarti "string yang tidak mengandung karakter apa pun yang signifikan dalam konteks saat ini".

Ini bisa berarti secara visual, karena dalam warna dan warna latar belakang sama dalam string yang dikaitkan. Secara efektif kosong.

Ini bisa berarti kosong dari karakter yang bermakna. Semua titik atau semua garis putus-putus atau semua garis bawah mungkin dianggap kosong. Selanjutnya, kosong dari karakter signifikan yang berarti dapat berarti string yang tidak memiliki karakter yang dipahami pembaca. Mereka bisa berupa karakter dalam bahasa atau karakter yang ditetapkan sebagai tidak berarti bagi pembaca. Kita dapat mendefinisikannya sedikit berbeda dengan mengatakan string tidak membentuk kata-kata yang dikenal dalam bahasa tertentu.

Kita dapat mengatakan kosong adalah fungsi dari persentase ruang negatif dalam mesin terbang yang diberikan.

Bahkan urutan karakter yang tidak dapat dicetak tanpa representasi visual umum tidak benar-benar kosong. Karakter kontrol muncul di pikiran. Terutama kisaran ASCII rendah (saya terkejut tidak ada yang menyebutkan mereka karena mereka menyemprot banyak sistem dan bukan spasi karena mereka biasanya tidak memiliki mesin terbang dan tidak ada metrik visual). Namun panjang tali bukanlah nol.

Kesimpulan. Panjang saja bukan satu-satunya ukuran di sini. Keanggotaan kontekstual juga cukup penting.

Character Set keanggotaan adalah ukuran tambahan umum yang sangat penting. Urutan yang bermakna juga cukup umum. (pikirkan SETI atau crypto atau captcha) Tambahan set konteks yang lebih abstrak juga ada.

Jadi pikirkan baik-baik sebelum menganggap string hanya kosong berdasarkan panjang atau spasi.

uchuugaka
sumber
2

Posting yang sangat berguna, untuk menambahkan dukungan NSDictionary juga satu perubahan kecil

static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && ![thing respondsToSelector:@selector(count)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [thing count] == 0);
}
Zeev Vax
sumber
Salinan komentar @Brane: Jika Anda berada dalam situasi di mana Anda tidak tahu jenis objek apa yang Anda periksa, saya kira ini berfungsi. Namun saya menyarankan bahwa jika Anda tidak tahu apakah suatu objek NSData atau NSDictionary, Anda memiliki masalah yang lebih besar. Apa makro Anda selanjutnya setelah panggilan ini condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Cepat atau lambat, Anda akan bertanya kelas apa yang Anda hadapi, lebih baik melakukannya dengan referensi pertama.
Cœur
2
- (BOOL)isEmpty:(NSString *)string{
    if ((NSNull *) string == [NSNull null]) {
        return YES;
    }
    if (string == nil) {
        return YES;
    }
    if ([string length] == 0) {
        return YES;
    }
    if ([[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) {
        return YES;
    }
    if([[string stringByStrippingWhitespace] isEqualToString:@""]){
        return YES;
    }
    return NO;
}
Ptbailey
sumber
1
Tiga kondisi pertama adalah mubazir, dan Anda belum memasukkan sumber untukstringByStrippingWhitespace
mattsven
2

Cara terbaik adalah menggunakan kategorinya.
Anda dapat memeriksa fungsi berikut. Yang memiliki semua kondisi untuk diperiksa.

-(BOOL)isNullString:(NSString *)aStr{
        if([(NSNull *)aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if ((NSNull *)aStr  == [NSNull null]) {
            return YES;
        }
        if ([aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if(![[aStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]){
            return YES;
        }
        return NO;
    }
Tarun
sumber
1

Cara terbaik dalam hal apapun adalah memeriksa panjang string yang diberikan. Untuk ini jika string Anda adalah myString maka kodenya adalah:

    int len = [myString length];
    if(len == 0){
       NSLog(@"String is empty");
    }
    else{
      NSLog(@"String is : %@", myString);
    }
AJS
sumber
1
if (string.length == 0) stringIsEmpty;
Heli Terbalik
sumber
1

Periksa ini :

if ([yourString isEqualToString:@""])
{
    NsLog(@"Blank String");
}

Atau

if ([yourString length] == 0)
{
    NsLog(@"Blank String");
}

Semoga ini bisa membantu.

Mayur
sumber
1

Anda dapat dengan mudah memeriksa apakah string kosong dengan ini:

if ([yourstring isEqualToString:@""]) {
    // execute your action here if string is empty
}
pengguna3213914
sumber
1

Saya telah memeriksa string kosong menggunakan kode di bawah ini:

//Check if we have any search terms in the search dictionary.
if( (strMyString.text==(id) [NSNull null] || [strMyString.text length]==0 
       || strMyString.text isEqual:@"")) {

   [AlertView showAlert:@"Please enter a valid string"];  
}
Jayprakash Dubey
sumber
1

Sesederhana if([myString isEqual:@""])atauif([myString isEqualToString:@""])

Ahsan Ebrahim
sumber
1
//Different validations:
 NSString * inputStr = @"Hey ";

//Check length
[inputStr length]

//Coming from server, check if its NSNull
[inputStr isEqual:[NSNull null]] ? nil : inputStr

//For validation in allowed character set
-(BOOL)validateString:(NSString*)inputStr
{
    BOOL isValid = NO;
    if(!([inputStr length]>0))
    {
        return isValid;

    }

    NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@".-"];
    [allowedSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
    if ([inputStr rangeOfCharacterFromSet:[allowedSet invertedSet]].location == NSNotFound)
    {
        // contains only decimal set and '-' and '.'

    }
    else
    {
        // invalid
        isValid = NO;

    }
    return isValid;
}
Rohit Kashyap
sumber
0

Anda dapat memiliki string kosong dengan dua cara:

1) @ "" // Tidak mengandung ruang

2) @ "" // Mengandung Ruang

Secara teknis kedua senarnya kosong. Kita dapat menulis kedua hal itu hanya dengan menggunakan ONE Condition

if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
    NSLog(@"Empty String");
}
else
{
    NSLog(@"String contains some value");
}
Chetan Rajauria
sumber
0

Coba yang berikut ini

NSString *stringToCheck = @"";

if ([stringToCheck isEqualToString:@""])
{
   NSLog(@"String Empty");
}
else
{
   NSLog(@"String Not Empty");
}
Rich Allen
sumber
-1
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
    NSLog(@"String is empty");
}
else{
    NSLog(@"String is not empty");
}    
C_compnay
sumber
1
Cek nol harus menjadi yang pertama. str.lengthakan melempar pengecualian jika strnol.
Jeffery Thomas
-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
Mohsin Sabasara
sumber