Bagaimana saya menguji jika string kosong di Objective-C?


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.


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);
}

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!");

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);
}

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

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.


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);
}

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;
}

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
}

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?


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;
    }

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.


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.


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


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

}

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.


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);
}

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;
}

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;
    }

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);
    }


1

Periksa ini :

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

Atau

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

Semoga ini bisa membantu.


1

Anda dapat dengan mudah memeriksa apakah string kosong dengan ini:

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

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"];  
}

1

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


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;
}

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");
}

0

Coba yang berikut ini

NSString *stringToCheck = @"";

if ([stringToCheck isEqualToString:@""])
{
   NSLog(@"String Empty");
}
else
{
   NSLog(@"String Not Empty");
}

-1
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
    NSLog(@"String is empty");
}
else{
    NSLog(@"String is not empty");
}    

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)];
}
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.