2011-09-01 9 views

Respuesta

101
NSString *str = @"   "; 
NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet]; 
if ([[str stringByTrimmingCharactersInSet: set] length] == 0) 
{ 
    // String contains only whitespace. 
} 
+21

Dependiendo de la situación, es posible que desee utilizar 'whitespaceAndNewlineCharacterSet' en lugar de exactamente lo que dice en la lata). – BoltClock

0

Recorte el espacio y verifique el número de caracteres restantes. Echar un vistazo a este post here

8

Trate despojándola de espacios y comparándolo con @ "":

NSString *probablyEmpty = [myString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
BOOL wereOnlySpaces = [probablyEmpty isEqualToString:@""]; 
2

Prueba esto:

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

o

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
+0

Este es un método 'NSMutableString'. –

+5

Um, no, no lo es. Devuelve un NSString nuevo y se declara en NSString.h. – picciano

+0

En realidad, no está definido en ninguna parte. –

0

Aquí es una categoría fácilmente reutilizable en NSString según la respuesta de @Alexander Akers, pero eso también YES devuelve si la cadena contiene "nuevas" líneas ...

@interface NSString (WhiteSpaceDetect) 
@property (readonly) BOOL isOnlyWhitespace; 
@end 
@implementation NSString (WhiteSpaceDetect) 
- (BOOL) isOnlyWhitespace { 
    return ![self stringByTrimmingCharactersInSet: 
      [NSCharacterSet whitespaceAndNewlineCharacterSet]].length; 
} 
@end 

y para aquellos de ustedes, almas untrusting por ahí ..

#define WHITE_TEST(x) for (id z in x) printf("\"%s\" : %s\n",[z UTF8String], [z isOnlyWhitespace] ? "YES" :"NO") 

WHITE_TEST(({ @[ 

    @"Applebottom", 
    @"jeans\n", 
    @"\n", 
    @"" 
    "", 
    @" \ 
    \ 
    ", 
    @" " 
];})); 

"Applebottom" : NO 
"jeans 
" : NO 
" 
" : YES 
"" : YES 
" " : YES 
" " : YES 
-1

Aquí es un simple Solución Swift:

//Check if string contains only empty spaces and new line characters 
static func isStringEmpty(#text: String) -> Bool { 
    let characterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet() 
    let newText = text.stringByTrimmingCharactersInSet(characterSet) 
    return newText.isEmpty 
} 
+0

¿por qué el voto hacia abajo? – Esqarrouth

-1

Aquí está el código de la versión Swift para el mismo,

var str = "Hello World" 
if count(str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())) == 0 { 
    // String is empty or contains only white spaces 
} 
else { 
    // String is not empty and contains other characters 
} 

o puede escribir una extensión de cadena sencilla, como a continuación y utilizar el mismo código con una mejor lectura en múltiples lugares.

extension String { 
    func isEmptyOrContainsOnlySpaces() -> Bool { 
     return count(self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())) == 0 
    } 
} 

y simplemente llamarlo usando cualquier cadena como esta,

var str1 = " " 
if str.isEmptyOrContainsOnlySpaces() { 
    // custom code e.g Show an alert 
} 
7

Es mucho más rápido para comprobar el rango de caracteres no está en blanco en lugar de recortar toda la cadena.

NSCharacterSet *inverted = [[NSCharacterSet whitespaceAndNewlineCharacterSet] invertedSet]; 
NSRange range = [string rangeOfCharacterFromSet:inverted]; 
BOOL empty = (range.location == NSNotFound); 

Tenga en cuenta que "lleno" es probablemente el caso más común con una combinación de espacios y texto.

testSpeedOfSearchFilled - 0.012 sec 
testSpeedOfTrimFilled - 0.475 sec 
testSpeedOfSearchEmpty - 1.794 sec 
testSpeedOfTrimEmpty - 3.032 sec 

Las pruebas se ejecutan en mi iPhone 6+. Código here. Pegue en cualquier subclase XCTestCase.

+2

Esta respuesta es de lejos la mejor. Me sorprendió mucho que mucha gente fuera ciegamente a buscar soluciones. Sin embargo, debe corregir un error tipográfico: si range.location! = NSNotFound significa que ha encontrado un carácter no WS, lo que significa que la cadena no está vacía. Entonces necesitas invertir la condición. – battlmonstr

0

tiene que usar este código para Swift 3:

func isEmptyOrContainsOnlySpaces() -> Bool { 

    return self.trimmingCharacters(in: .whitespaces).characters.count == 0 
} 
0

Estoy muy sorprendido de que yo soy el primero que sugiere de expresiones regulares

NSString *string = @"   "; 
NSString *pattern = @"^\\s*$"; 
NSRegularExpression *expression = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; 
NSArray *matches = [expression matchesInString:string options:0 range:NSMakeRange(0, string.length)]; 
BOOL isOnlyWhitespace = matches.count; 

O en Swift:

let string = "   " 
let pattern = "^\\s*$" 
let expression = try! NSRegularExpression(pattern:pattern, options:[]) 
let matches = expression.matches(in: string, options: [], range:NSRange(location: 0, length: string.utf16.count)) 
let isOnlyWhitespace = !matches.isEmpty 
Cuestiones relacionadas