Objective-C에서 문자열이 비어 있는지 어떻게 테스트합니까?


답변:


1156

여부를 확인할 수 있습니다 [string length] == 0. nil을 호출 length하면 0이 반환 되므로 유효하지만 빈 문자열 (@ "")인지 nil인지 확인합니다 .


12
매우 드문 NSString이 있는데,이 경우 거짓 부정이 발생합니다 (실제 목적으로 문자열이 비어 있지 않은 경우). @"\u200B"(유니 코드 문자 ZERO WIDTH SPACE 로만 구성 하십시오 . 인쇄하면 0 문자를 인쇄하지만 ( 단일 공백 글꼴을 사용하여 확인) string.length는 1을 제공합니다. OBJECT REPLACEMENT CHARACTER 와 같은 다른 유니 코드 문자 도 이와 유사하게 작동합니다. PDF 텍스트를 파싱 할 때 후자를 얻으십시오
fzwo

43
@fzwo는 논쟁이 될 수 없지만 이론적으로는 거짓 부정을주지 않습니다. 예상 대로 정확하게 동작 합니다 . 문자 ZERO WIDTH SPACE 있기 때문에 실제로 중요하지 않은 것에 대한 해석은 문자열이 비어 있는지 테스트하면 문자가 없기 때문에 그렇지 않다고 말할 것입니다. 유니 코드 표준에 따라 인쇄 할 수 없습니다. @"\u200B"
bmeulmeester

2
물론 그것은 기술적으로 정확합니다. 나는 그것을 토론하지 않습니다. 나는 이것이 의도 된 또는 예상 된 행동을 나타내지 않을 수 있다는 점에주의를 기울이고 자하므로 "실용적인 목적으로"쓴 것입니다. "빈"의 의도 된 의미에 따라 다릅니다.
fzwo

4
거짓 부정이 아닙니다. "제로 가치 공간"은 다른 유니 코드 문자입니다. 앱과 관련이 있다면 "기억해야"합니다. (훌륭한 생각, fzwo!)
Fattie

2
내가 틀렸다면 알려주십시오.하지만 == 0 부분을 생략하고 앞에 부정을 추가 할 수 있다고 생각합니다 ![string length]. 더 깨끗해 보입니다.
damirstuhec

126

마크의 대답은 맞습니다. 그러나 나는이 기회를 통해 Wil Shipley의 일반화 된 블로그isEmpty 에 대한 포인터를 포함시킬 것입니다 .

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
이것을 매우 일반화하려면 여기에 표시된 것처럼 정적 메소드를 사용하는 대신 NSObject에서이 로직을 카테고리로 구현할 수 있습니다.
브래드 앱 가이

16
이상하게도 실제로는 [NSNull null]을 확인하지 않습니다.
피터 N 루이스

14
어떤 유형의 객체를 확인하고 있는지 모르는 상황에서는 이것이 효과가 있다고 생각합니다. 그러나 객체가 NSData인지 NSArray인지 모르는 경우 더 큰 문제가 있다고 제안합니다. 이 호출 후 다음 매크로는 무엇입니까, condenseToSingleNSData (id thing)? expandToNSArray (id thing)? 조만간, 당신은 어떤 종류의 수업을하는지 물어볼 것입니다.
Brane

1
@BradSmith, 카테고리를 만들 수는 있지만 메소드가 호출되지 않으므로 nil 값은 계산되지 않습니다. 예를 들어, thing = nil 인 경우 [thing IsEmpty]는 호출되지 않으며 항상 false / NO를 반환합니다. nil을 확인하려면 매개 변수가 있어야합니다. Nil 객체는 범주를 통해 자신을 NIL로 비교할 수 없습니다.
Chris

3
@ chris 다음 카테고리 방법을 다음과 같이 변경할 수 있습니다 -isNotEmpty:)
nielsbot

93

첫 번째 방법은 유효하지만 문자열에 공백 ( @" ") 이 있으면 작동하지 않습니다 . 따라서 테스트하기 전에이 공백을 지워야합니다.

이 코드는 문자열 양쪽의 모든 공백을 지 웁니다.

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

한 가지 좋은 아이디어는 하나의 매크로를 만드는 것이므로이 몬스터 라인을 입력 할 필요가 없습니다.

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

이제 다음을 사용할 수 있습니다.

NSString *emptyString = @"   ";

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

3
왜 매크로가 필요하지 않을 때 매크로를 사용합니까? 이 경우 어떠한 종류의 안전도 희생되지 않으며 실제 이익은 없습니다.
EM

하나의 문자열이 비어 있는지 확인하고 싶을 때마다 "[object stringObject stringByTrimmingCharactersInSet : [NSCharacterSet whitespaceCharacterSet]]"을 작성하려는 경우 간단한 편의를 제공합니다.
SEQOY Development Team

18
그것은 당신이 쓴 것을 정확하게 NSString하는 메소드를 추가 하는 카테고리에 의해 더 잘 제공됩니다 trimmedString.
Dave DeLong

2
Apple whitespaceCharacterSet에는 줄 바꿈이 포함되어 있지 않습니다! 여기에 내가 쓴 카테고리 trim와 다른 유용한 방법들이 있습니다 : github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
AlexChaffee

@EM 저는 매크로 팬이 아니지만 형식 안전 문제를 이해하지 못합니다. 컴파일하는 동안 매크로는 내용으로 대체되므로 NSString과 다른 매크로를 호출하면 컴파일러에서 여전히 메시지를받습니다. 어쨌든 카테고리가 훨씬 나을 것입니다.
Zmaster

32

내가 본 최고의 솔루션 중 하나 (Matt G보다 낫다)는 Git Hub 저장소 (Willey의 솔루션이지만 링크를 찾을 수 없음)에서 가져온이 향상된 인라인 기능입니다.

// 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
이것은 Wil Shipley의 작품입니다. 참고로, [thing isKindOfClass : [NSNull class]]를 그냥 (thing == [NSNull null])로 변경할 수 있습니다
Steve N

휴 .. 정확히 내가 찾던 것. null 문자열로 인해 "cellForRowAtIndexPath"함수가 충돌하는 이유를 알아 내려고 노력하면서 화를 냈습니다 (그리고 문제를 잡을 수 없었습니다). 이 기능은 완벽하게 해결되었습니다.
Mike Gledhill 2012

@Brane 의견의 사본 : 확인중인 객체 유형을 모르는 상황에서는 이것이 효과가 있다고 생각합니다. 그러나 객체가 NSData인지 NSArray인지 모르는 경우 더 큰 문제가 있다고 제안합니다. 이 호출 후에 다음 매크로는 무엇입니까 condenseToSingleNSData(id thing)? expandToNSArray(id thing)? 조만간, 당신은 어떤 종류의 수업을하는지 물어볼 것입니다.
Cœur

16

이 카테고리를 더 잘 사용해야합니다.

@implementation NSString (Empty)

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

@end

6
이 정의는 문자열 "/ r / n / r / n"이 명확하지 않은 경우 비어 있음을 의미합니다. 공백이 포함되어 있습니다. 함수는 실제로 다음과 같습니다.-(BOOL) isWhitespace (NSString *);
JBR 윌킨슨

6
이것에 대한 추론. 나는이 범주를 구현했으며 비틀기가 있습니다. nil 문자열에서 이것을 호출하면이 함수는 호출되지 않으며 NO (또는 NO로 평가되는 것)를 반환 값으로 다시 얻습니다. 그런 다음 비어 있지 않다고 생각합니다 ... 이름이 채워진 경우 또는 이와 비슷한 경우 작동 할 수 있습니다.
Ying

그렇다면 올바른 카테고리는 다음과 같습니다. @implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end Marc 's와 Kyle 's의 조합입니다.
palme

12

나는 이것을 넣었다.

@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

문제는 self가 nil이면이 함수가 호출되지 않는다는 것입니다. 원하는 false를 반환합니다.


a)는 인스턴스 메소드이고 b) 범주 c) nil 케이스 자체는 'isNotEmpty'Thx에 의해 처리되므로 최상의 솔루션입니다!
Denis

좋은 생각, 너무 나쁜 것은 -(BOOL)isEmpty{ return ![self isNotEmpty]}범주에서 작동하지 않습니다.
Alston

@Brane 의견의 사본 : 확인중인 객체 유형을 모르는 상황에서는 이것이 효과가 있다고 생각합니다. 그러나 객체가 NSData인지 NSArray인지 모르는 경우 더 큰 문제가 있다고 제안합니다. 이 호출 후에 다음 매크로는 무엇입니까 condenseToSingleNSData(id thing)? expandToNSArray(id thing)? 조만간, 당신은 어떤 종류의 수업을하는지 물어볼 것입니다.
Cœur

11

이 같은 경우는 또 다른 옵션은 확인하는 것입니다 @""isEqualToString:이렇게 같은 :

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

11

문자열을 다음 방법으로 전달하십시오.

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

이것이 왜 잘못된 지 stackoverflow.com/questions/21605075/… 에 대한 의견을 확인하십시오 . 또한 여기에있는 다른 대답보다 이것이 더 낫습니다.
Popeye 2019

6

if else아래와 같이 조건 중 하나를 사용하십시오 .

방법 1 :

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

방법 2 :

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

6

스위프트 버전

이것이 Objective C 질문이지만 NSStringSwift 에서 사용해야 하므로 여기에 답변을 포함 시키 십시오.

let myNSString: NSString = ""

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

또는 NSString선택 사항 인 경우 :

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

일반적인 스위프트 String버전은

let myString: String = ""

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

참조 : 스위프트에 빈 문자열을 확인?


5

이 답변이 이미 주어진 답변의 복제본 일 수는 있지만 조건을 확인하는 순서로 수정 및 변경을 거의하지 않았습니다. 아래 코드를 참조하십시오 :

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

카테고리는 goo.gl/bRcfn7 에서 카테고리를 만드는 방법을 볼 수 있습니다 . 나는 이것에 대한 범주의 아이디어를 좋아한다
Daniel Gomez Rico

아니요, 카테고리라고 말할 수 없습니다. 이 함수가 NSString 클래스의 범주에서 구현되는 경우 범주입니다. 그렇지 않으면 구현할 때마다 클래스 이름으로이 메소드를 호출 할 수 있습니다. Bool isEmptyStr = [MyClassName isStringEmpty : str]처럼 카테고리 아래에 선언하면 더 좋습니다. 어쨌든 카테고리를 활용해야합니다.
iDevAmit

4

이 방법을 사용하여 문자열이 비어 있거나 아닌지 확인할 수 있습니다.

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

모범 사례는 공유 클래스를 UtilityClass라고 말하고이 메소드를 광고하여 애플리케이션을 호출하여이 메소드를 사용할 수 있도록하는 것입니다.


4

문자열이 비어 있는지 확인하는 두 가지 방법이 있습니다.

문자열 이름이이라고 가정 해 봅시다 NSString *strIsEmpty.

방법 1 :

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

else
{
    //String is not empty
}

방법 2 :

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

else
{
    //String is not empty
}

위의 방법 중 하나를 선택하고 문자열이 비어 있는지 확인하십시오.


3

간단히 당신의 문자열 길이를 확인

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

NIL에 대한 메시지는 nil 또는 0을 반환하므로 nil을 테스트 할 필요가 없습니다 :).

행복한 코딩 ...


나는 이것을 여러 번 사용했다. 확장 프로그램, 카테고리 등이 필요하지 않습니다.
pnizzle

2

그것은 나를위한 매력으로 일하고있다

는 경우 NSString입니다s

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

    NSLog(@"s is empty");

} else {

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

}

2

따라서 1보다 작은 문자열 길이를 확인하는 기본 개념 외에 컨텍스트를 깊이 고려하는 것이 중요합니다. 사람이나 컴퓨터의 언어 또는 다른 방식으로 빈 문자열에 대한 다른 정의가있을 수 있으며 동일한 언어 내에서 추가 컨텍스트로 인해 의미가 더 변경 될 수 있습니다.

빈 문자열은 "현재 컨텍스트에서 중요한 문자를 포함하지 않는 문자열"을 의미한다고 가정합니다.

색상 및 배경색이 속성 문자열에서 동일하므로 시각적으로 의미 할 수 있습니다. 효과적으로 비 웁니다.

이것은 의미있는 문자가 없음을 의미 할 수 있습니다. 모든 점 또는 모든 대시 또는 모든 밑줄은 비어있는 것으로 간주 될 수 있습니다. 또한 의미있는 유효 문자가 비어 있으면 독자가 이해하는 문자가없는 문자열을 의미 할 수 있습니다. 독자에게 무의미한 것으로 정의 된 언어 또는 문자 집합의 문자 일 수 있습니다. 우리는 문자열이 주어진 언어에서 알려진 단어를 형성하지 않는다고 다르게 정의 할 수 있습니다.

우리는 empty가 glyphs에서 음수 공간의 백분율 함수라고 말할 수 있습니다.

일반적인 시각적 표현이없는 일련의 인쇄 할 수없는 문자조차도 실제로 비어 있지는 않습니다. 컨트롤 캐릭터가 떠 오릅니다. 특히 낮은 ASCII 범위 (많은 시스템을 호스로 사용하고 일반적으로 글리프가없고 시각적 메트릭이 없기 때문에 공백이 아니므로 아무도 언급하지 않았습니다.) 그러나 문자열 길이는 0이 아닙니다.

결론. 여기서 길이 만 측정하는 것은 아닙니다. 상황 별 멤버십도 매우 중요합니다.

문자 집합 멤버쉽은 매우 중요한 공통 추가 측정입니다. 의미있는 순서도 상당히 일반적입니다. (SETI 또는 crypto 또는 captchas라고 생각하십시오) 더 추상적 인 컨텍스트 세트가 더 있습니다.

따라서 문자열이 길이 또는 공백을 기준으로 비어 있다고 가정하기 전에 신중하게 생각하십시오.


2

NSDictionary 지원과 작은 변경 사항을 추가하는 매우 유용한 게시물

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 의견의 사본 : 확인중인 객체 유형을 모르는 상황에서는 이것이 효과가 있다고 생각합니다. 그러나 객체가 NSData인지 NSDictionary인지 모르는 경우 더 큰 문제가있는 것이 좋습니다. 이 호출 후에 다음 매크로는 무엇입니까 condenseToSingleNSData(id thing)? expandToNSArray(id thing)? 조만간, 당신은 어떤 종류의 수업을하는지 물어볼 것입니다.
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
처음 세 가지 조건은 중복되므로 다음 소스를 포함하지 않았습니다.stringByStrippingWhitespace
mattsven

2

가장 좋은 방법은 카테고리를 사용하는 것입니다.
다음 기능을 확인할 수 있습니다. 확인할 모든 조건이 있습니다.

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

가장 좋은 방법은 주어진 문자열의 길이를 확인하는 것입니다. 문자열이 myString이면 코드는 다음과 같습니다.

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


1

이것을 확인하십시오 :

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

또는

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

이것이 도움이되기를 바랍니다.


1

다음과 같이 문자열이 비어 있는지 쉽게 확인할 수 있습니다.

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

1

아래 코드를 사용하여 빈 문자열을 확인했습니다.

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

두 가지 방법으로 빈 문자열을 가질 수 있습니다.

1) @ ""// 공백을 포함하지 않습니다

2) @ ""// 공간을 포함

기술적으로 두 문자열은 모두 비어 있습니다. ONE Condition 을 사용하여 두 가지를 모두 쓸 수 있습니다.

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

0

다음을 시도하십시오

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
널 점검이 먼저되어야합니다. null의 str.length경우 str는 예외를 throw합니다 .
Jeffery Thomas

-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.