Objective-C'de bir dizenin boş olup olmadığını nasıl test edebilirim?


Yanıtlar:


1156

Eğer olup olmadığını kontrol edebilirsiniz [string length] == 0. Bu, geçerli ancak boş bir dize (@ "") ve nil olup olmadığını kontrol edecektir, çünkü lengthnil çağrısı da 0 döndürecektir.


12
Bunun yanlış bir negatif ile sonuçlanacağı çok nadir bazı NSStrings'ler vardır (pratik amaçlar için olduğunda dize boş değildir). Düşünün @"\u200B"(sadece Unicode karakter oluşan SIFIR GENİŞLİK UZAY () boşluklu yazı tipini kullanarak doğrulama gibi, ama diğer Unicode karakterleri (vardır String.length 1. verecektir 0 karakter yazdırır. Baskı dışarı OBJE DEĞİŞTİRME KARAKTER aynı şekilde davranırlar). Sen edebilir PDF metni ayrıştırılırken ikincisini alın
fzwo

43
@fzwo bir eşek olmamalı, ama teorik olarak yanlış negatif vermez. Tam olarak beklediğiniz gibi davranır . Ne senin yorumlanması ZERO WIDTH SPACEnedeniyle gerçekten önemli, değil ise @"\u200B" değildir yine de bu yüzden dize boş olması için test eğer bir karakter, içinde bir karakter olduğu için değil diyecekler. Unicode standardına göre yazdırılamaz.
bmeulmeester

2
Tabii ki teknik olarak doğru, bunu tartışmıyorum. Sadece bunun amaçlanan veya beklenen davranışı göstermeyebileceği konusunda uyarmak istiyorum, bu yüzden "pratik amaçlar için" yazdım. "Boş" un amaçlanan anlamına bağlıdır.
fzwo

4
Bu yanlış bir negatif değil. "Sıfır değere sahip alan", diğerleri gibi unicode bir karakterdir. Uygulamanızla ilgili ise yalnızca "hatırlamaya değer" dir. (Harika düşünme, fzwo!)
Fattie

2
Yanılıyorsam bana bildirin, ama olabilir de omit == 0 parçası düşünmek ve önünde bir olumsuzlamasıydı ekleyin: ![string length]. Daha temiz görünüyor.
damirstuhec

126

Marc'ın cevabı doğrudur. Ama bu fırsatı Wil Shipley'in genelleştirilmiş bloguna eklediği isEmptyve blogunda paylaştığı bir işaretçi eklemek için kullanacağım :

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
Bunun çok genelleştirilmesini istiyorsanız, bu mantığı burada gösterildiği gibi statik bir yöntem kullanmak yerine NSObject üzerinde bir kategori olarak uygulayabilirsiniz.
Brad App Guy

16
Tuhaf bir şekilde, bu aslında [NSNull null] değerini kontrol etmez.
Peter N Lewis

14
Ne tür bir nesneyi kontrol ettiğinizi bilmediğiniz bir durumdaysanız, sanırım bu işe yarıyor. Ancak bir nesnenin NSData veya NSArray olup olmadığını bilmiyorsanız, daha büyük sorunlarınız olduğunu öneririm. CondenseToSingleNSData (id şey) çağrısından sonra bir sonraki makronuz ne olacak? expandToNSArray (id şey)? Er ya da geç, ne tür bir sınıfla uğraştığınızı soracaksınız, ilk referansta bunu yapmak daha iyi.
Brane

1
@BradSmith, biri için bir kategori oluşturabilir, ancak yöntem çağrılmayacağı için sıfır değerleri sayılmaz. Örneğin, thing = nil, [thing IsEmpty] çağrılmaz ve her zaman false / NO döndürür. Nil'i kontrol etmek için bir parametre olması gerekir. Nil nesneleri bir kategori aracılığıyla kendilerini nil olarak karşılaştıramazlar.
Chris

3
@chris sonra kategori yöntemini -isNotEmpty:) olarak değiştirebilirsiniz
nielsbot

93

İlk yaklaşım geçerlidir, ancak dizenizde boşluklar ( @" ") varsa çalışmaz . Bu yüzden test etmeden önce bu boşlukları temizlemelisiniz.

Bu kod, dizenin her iki tarafındaki tüm boş alanları temizler:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

İyi bir fikir bir makro oluşturmaktır, bu yüzden bu canavar satırını yazmak zorunda değilsiniz:

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

Şimdi şunları kullanabilirsiniz:

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");

3
Neden gerekli olmadıklarında makrolar kullanılır? Bu durumda, herhangi bir tür güvenlik gerçek fayda olmaksızın feda edilir.
EM

"[Object stringObject stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]" "bir dizenin boş olup olmadığını kontrol etmek istediğiniz her seferinde size yazmak isterseniz, kolaylık sağlamak içindir.
SEQOY Geliştirme Takımı

18
tam olarak yazdıklarınızı yapan NSStringbir yöntem ekleyen bir kategori tarafından sunulması daha iyi olur trimmedString.
Dave DeLong

2
Apple'ın whitespaceCharacterSetyeni satır içermediğini unutmayın! İşte yazdığım bir kategori trimve diğer bazı yararlı yöntemler: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
AlexChaffee

@EM Ben makro hayranı değilim, ama tip güvenliği endişenizi anlamıyorum. Derleme sırasında makro içeriğiyle değiştirilir, böylece makroyu bir NSString öğesinden farklı bir şeyle çağırırsanız derleyiciden bir ileti alırsınız. Kategoriler zaten çok daha iyi olurdu.
Zmaster

32

Şimdiye kadar gördüğüm en iyi çözümlerden biri (Matt G'ninkinden daha iyi), bazı Git Hub repo'da aldığım bu geliştirilmiş satır içi işlev (Wil Shipley'nin bir tanesi, ancak bağlantıyı bulamıyorum):

// 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
Bu Wil Shipley'nin işi. Bilginize, [thing isKindOfClass: [NSNull class]] öğesini yalnızca (thing == [NSNull null]) olarak değiştirebilirsiniz
Steve N

Vay be .... tam olarak aradığım şey. Ben deliriyordum, neden "cellForRowAtIndexPath" fonksiyonumun null dizeleri nedeniyle çöktüğünü anlamaya çalışıyordum (ve problemi yakalayamadım). Bu işlev mükemmel bir şekilde çözdü.
Mike Gledhill

@Brane yorumunun kopyası: Ne tür bir nesneyi kontrol ettiğinizi bilmediğiniz bir durumdaysanız, sanırım bu işe yarıyor. Ancak bir nesnenin NSData veya NSArray olup olmadığını bilmiyorsanız, daha büyük sorunlarınız olduğunu öneririm. Bu görüşmeden sonra bir sonraki makronuz ne olacak condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Er ya da geç, ne tür bir sınıfla uğraştığınızı soracaksınız, ilk referansta bunu yapmak daha iyi.
Coeur

16

Bu kategoriyi daha iyi kullanmalısınız:

@implementation NSString (Empty)

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

@end

6
Bu tanım, "/ r / n / r / n" dizesinin boş olmadığını, açıkça olmadığında - boşluk içerdiğini içerir. İşleviniz gerçekten: - (BOOL) isWhitespace (NSString *);
JBRWilkinson

6
Buna bir sonuç. Bu kategoriyi uyguladım ve bir bükülme var. Bunu bir nil dizesinde çağırırsanız, bu işlev hiçbir zaman çağrılmaz ve bir dönüş değeri olarak NO (veya NO olarak değerlendirilen) değerini geri alırsınız. O zaman boş olmadığını düşünüyorsunuz ... Bu, ad Doldurulmuşsa veya bunun gibi bir şeyse işe yarayabilir.
Ying

Sanırım doğru kategori şu olurdu: @implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end Marc ve Kyle'ın cevabının bir kombinasyonu olarak.
palme

12

Bunu koydum:

@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

Sorun şu ki, eğer ben kendini sıfır ise, bu fonksiyon asla çağrılmaz. İstenilen yanlış döndürür.


a) örnek yöntem ve b) kategori c) nil durumda 'isNotEmpty' Thx!
Denis

Harika fikir, çok kötü -(BOOL)isEmpty{ return ![self isNotEmpty]}kategori üzerinde çalışmayacak.
Alston

@Brane yorumunun kopyası: Ne tür bir nesneyi kontrol ettiğinizi bilmediğiniz bir durumdaysanız, sanırım bu işe yarıyor. Ancak bir nesnenin NSData veya NSArray olup olmadığını bilmiyorsanız, daha büyük sorunlarınız olduğunu öneririm. Bu görüşmeden sonra bir sonraki makronuz ne olacak condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Er ya da geç, ne tür bir sınıfla uğraştığınızı soracaksınız, ilk referansta bunu yapmak daha iyi.
Coeur

11

O eşitse Başka bir seçenek kontrol etmektir @""ile isEqualToString:şöyle:

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

11

Dizenizi aşağıdaki yönteme geçirmeniz yeterlidir:

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

Bunun neden yanlış olduğuna ilişkin stackoverflow.com/questions/21605075/… adresindeki yorumlara göz atın . Ayrıca, buradaki diğer cevaplardan daha iyi.
Temel Reis

6

Sadece if elseaşağıda gösterilen koşullardan birini kullanın :

Yöntem 1:

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

Yöntem 2:

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

6

Hızlı Sürüm

Bu bir Objective C sorusu olmasına rağmen NSString, Swift'te kullanmam gerekiyordu, bu yüzden burada bir cevap da ekleyeceğim.

let myNSString: NSString = ""

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

Veya NSStringİsteğe bağlı ise:

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

Normal Swift Stringsürümü

let myString: String = ""

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

Ayrıca bkz: Swift'teki boş dizeyi kontrol et?


5

Bu cevap zaten verilen cevapların kopyası olabilir, ancak koşulları kontrol etme sırasına birkaç değişiklik ve değişiklik yaptım. Lütfen aşağıdaki kodu inceleyin:

+(BOOL)isStringEmpty:(NSString *)str
    {
        if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
            return YES;
       }
        return NO;
    }

Bu bir kategoridir, nasıl oluşturulacağını burada görebilirsiniz: goo.gl/bRcfn7 . Bunun için bir kategori fikrini seviyorum
Daniel Gomez Rico

Hayır, bunun kategori olduğunu söyleyemeyiz. Bu işlev NSString sınıfı kategorisi altında uygulanırsa, kategori olur. Aksi takdirde, bu yöntemi uyguladığımız her yerde sınıf adıyla çağırabiliriz. Bool gibi isEmptyStr = [MyClassName isStringEmpty: str] Ama yine de, kategori altında beyan edersek daha iyi olacak. Çünkü bir şekilde kategorilerden de faydalanmamız gerekiyor.
iDevAmit

4

Bu yöntemi kullanarak dizenizin boş olup olmadığını kontrol edebilirsiniz:

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

En iyi uygulama, paylaşılan bir sınıfın UtilityClass ve reklamı bu yöntemi söylemesini sağlamaktır, böylece bu yöntemi sadece uygulamanızı çağırarak kullanabilirsiniz.


4

Dizenin boş olup olmadığını kontrol etmek için 2 yönteminiz vardır:

Diyelim ki dize adınız NSString *strIsEmpty .

Yöntem 1:

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

else
{
    //String is not empty
}

Yöntem 2:

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

else
{
    //String is not empty
}

Yukarıdaki yöntemlerden herhangi birini seçin ve dizenin boş olup olmadığını öğrenin.


3

Basitçe dize uzunluğunuzu kontrol edin

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

NIL'e bir mesaj nil veya 0 döndürür, bu yüzden nil için test yapmaya gerek yoktur :).

Mutlu kodlama ...


Bunu birçok kez kullandım. Kesinlikle uzantılara, kategorilere ve neye gerek yok.
pnizzle

2

Benim için cazibe olarak çalışıyor

Eğer NSStringbirs

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

    NSLog(@"s is empty");

} else {

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

}

2

Bu nedenle, 1'den az bir dize uzunluğunu kontrol etme temel kavramının yanı sıra, bağlamı derinlemesine düşünmek önemlidir. İnsan veya bilgisayar dilleri veya başka türlü boş dizelerin farklı tanımları olabilir ve bu diller içinde ek bağlam anlamını daha da değiştirebilir.

Diyelim ki boş dize, "geçerli bağlamda önemli herhangi bir karakter içermeyen bir dize" anlamına gelir.

Bu, görsel olarak ifade edilebilir, çünkü renk ve arka plan rengi ilişkilendirilmiş bir dizede aynıdır. Etkili bir şekilde boş.

Bu anlamlı karakterlerin boşalması anlamına gelebilir. Tüm noktalar veya tüm çizgiler veya tüm alt çizgiler boş olarak değerlendirilebilir. Ayrıca, anlamlı anlamlı karakterlerin boşaltılması, okuyucunun anladığı hiçbir karakter içermeyen bir dize anlamına gelebilir. Bunlar bir dilde karakterler olabilir veya okuyucu için anlamsız olarak tanımlanan characterSet olabilir. Dizenin belirli bir dilde bilinen hiçbir kelime oluşturmadığını söylemek biraz farklı olabilir.

Boşun, oluşturulan gliflerdeki negatif alan yüzdesinin bir işlevi olduğunu söyleyebiliriz.

Genel görsel temsili olmayan yazdırılamayan karakterler dizisi bile gerçekten boş değildir. Kontrol karakterleri akla geliyor. Özellikle düşük ASCII aralığı (Kimsenin bunlardan çok fazla sistem hortumladıkları ve normalde glifleri ve görsel metrikleri olmadığı için boşluk olmadığı için bahsetmedim). Ancak dize uzunluğu sıfır değil.

Sonuç. Buradaki tek ölçü uzunluk değil. Bağlamsal set üyeliği de oldukça önemlidir.

Karakter Seti üyeliği çok önemli bir ortak ek önlemdir. Anlamlı diziler de oldukça yaygın olan dizilerdir. (SETI veya kripto veya captcha'ları düşünün) Başka soyut bağlam kümeleri de vardır.

Bu nedenle, bir dizenin yalnızca uzunluğa veya boşluğa göre boş olduğunu varsaymadan önce dikkatlice düşünün.


2

NSDictionary desteği ve bir küçük değişiklik eklemek için çok yararlı yazı

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

@Brane yorumunun kopyası: Ne tür bir nesneyi kontrol ettiğinizi bilmediğiniz bir durumdaysanız, sanırım bu işe yarıyor. Ancak bir nesnenin NSData veya NSDictionary olup olmadığını bilmiyorsanız, daha büyük sorunlarınız olduğunu öneririz. Bu görüşmeden sonra bir sonraki makronuz ne olacak condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Er ya da geç, ne tür bir sınıfla uğraştığınızı soracaksınız, ilk referansta bunu yapmak daha iyi.
Coeur

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
İlk üç koşul gereksizdir ve için kaynak stringByStrippingWhitespace
eklemediniz

2

En iyi yol kategoriyi kullanmaktır.
Aşağıdaki işlevi kontrol edebilirsiniz. Hangi kontrol etmek için tüm şartları vardır.

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

Her durumda en iyi yol verilen dizenin uzunluğunu kontrol etmektir. Bunun için dizeniz myString ise kod:

    int len = [myString length];
    if(len == 0){
       NSLog(@"String is empty");
    }
    else{
      NSLog(@"String is : %@", myString);
    }


1

şuna göz at :

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

Veya

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

Umarım bu yardımcı olur.


1

Bununla dizenin boş olup olmadığını kolayca kontrol edebilirsiniz:

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

1

Aşağıdaki kodu kullanarak boş bir dize kontrol ettim:

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

if([myString isEqual:@""])Veya kadar basitif([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

Boş bir dizeyi iki şekilde kullanabilirsiniz:

1) @ "" // Alan içermiyor

2) @ "" // Boşluk İçeren

Teknik olarak her iki dize de boştur. Biz sadece kullanarak ikisini de yazabilir BİR Durum

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

0

Takip etmeyi dene

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
Önce boş denetim olmalıdır. str.lengthboşsa bir istisna atar str.
Jeffery Thomas

-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.