¿Comprobar cadena vacía en Swift?

165

En el Objetivo C, uno podría hacer lo siguiente para verificar las cadenas:

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

¿Cómo se detectan cadenas vacías en Swift?

chrisjlee
fuente
3
Tu código objetivo está mal. Falla gravemente para cadenas nulas. En el objetivo C, uno realmente usa: if (myString.length) {'es una cadena con longitud}. Esto funciona en cadenas nulas también. Eso es simple y fácil de leer.
Tom Andersen

Respuestas:

241

Ahora existe la capacidad incorporada para detectar cadenas vacías con .isEmpty:

if emptyString.isEmpty {
    print("Nothing to see here")
}

Documentación preliminar de Apple: "Cadenas y caracteres" .

chrisjlee
fuente
1
También puede usar isEqualToString, que es útil si está inicializando var con NSString ('var emptyString: NSString'): emptyString.isEqualToString ("")
Sven
1
esta condición falla cuando el usuario ingresa espacios.
Shanu Singh
Actualización: Aquí está isEmpty: developer.apple.com/documentation/swift/string/2946268-isempty
chrisjlee
108

Una forma concisa de verificar si la cadena es nula o vacía sería:

var myString: String? = nil

if (myString ?? "").isEmpty {
    print("String is nil or empty")
}
Albert Bori
fuente
Esto es hermoso, pero ¿cómo usarías el valor sin envolver? Fuerza de desenvolver?
Nostalg.io
55
@halfnibble Puede hacer (desenvolvimiento implícito o forzado) o puede hacer:if let myString = myString where !myString.isEmpty { ... }
Albert Bori
52

Estoy reescribiendo completamente mi respuesta ( nuevamente ). Esta vez es porque me he convertido en un fanático de la guarddeclaración y el regreso temprano . Hace un código mucho más limpio.

Cadena no opcional

Verifique la longitud cero.

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
    return // or break, continue, throw
}

// myString is not empty (if this point is reached)
print(myString)

Si la ifdeclaración se aprueba, puede usar la cadena de forma segura sabiendo que no está vacía. Si está vacío, la función volverá antes y nada después importará.

Cadena opcional

Verifique la longitud nula o cero.

let myOptionalString: String? = nil

guard let myString = myOptionalString, !myString.isEmpty else {
    print("String is nil or empty.")
    return // or break, continue, throw
}

// myString is neither nil nor empty (if this point is reached)
print(myString)

Esto desenvuelve lo opcional y verifica que no esté vacío al mismo tiempo. Después de pasar la guarddeclaración, puede usar con seguridad su cadena no vacía sin envolver.

Suragch
fuente
40

En Xcode 11.3 swift 5.2 y posterior

Utilizar

var isEmpty: Bool { get } 

Ejemplo

let lang = "Swift 5"

if lang.isEmpty {
   print("Empty string")
}

Si quieres ignorar espacios en blanco

if lang.trimmingCharacters(in: .whitespaces).isEmpty {
   print("Empty string")
}
Saranjith
fuente
2
¿Hay alguna diferencia entre su respuesta y la excepción?
Ahmad F
Esto no funciona si el usuario solo ingresa un montón de espacios.
Supertecnoboff
2
En la tipografía, los espacios en blanco se consideran un carácter, por lo que no está vacío. Si lo desea, cambie la condición a 'lang.trimmingCharacters (en: .whitespaces) .isEmpty'
Saranjith
28

Así es como verifico si la cadena está en blanco. Por "en blanco" me refiero a una cadena que está vacía o que contiene solo caracteres de espacio / nueva línea.

struct MyString {
  static func blank(text: String) -> Bool {
    let trimmed = text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
    return trimmed.isEmpty
  }
}

Cómo utilizar:

MyString.blank(" ") // true
Evgenii
fuente
77
Y como extensión ... gist.github.com/danielgomezrico/f852114508c1cfaaa849
Daniel Gómez Rico
2
Como anexo, es posible que desee considerar usar el espacio en blanco y el conjunto de caracteres de línea nueva en lugar de solo el espacio en blanco.
fwielstra
1
gracias @fwielstra, ignorar nuevas líneas también será muy útil.
Evgenii
14

También puede usar una extensión opcional para no tener que preocuparse por desenvolver o usar == true:

extension String {
    var isBlank: Bool {
        return self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
    }
}
extension Optional where Wrapped == String {
    var isBlank: Bool {
        if let unwrapped = self {
            return unwrapped.isBlank
        } else {
            return true
        }
    }
}

Nota: cuando llame a esto de forma opcional, asegúrese de no usarlo ?o, de lo contrario, será necesario desenvolverlo.

John Montgomery
fuente
1
Me entusiasmé con esto, pero no funcionó :( Estoy en Swift 3.0
teradyl
@teradyl Por "no funcionó", ¿quiere decir que está recibiendo un error, tiene problemas con el autocompletado u otra cosa? Debería funcionar a menos que haya cambiado algo de lo que no estoy al tanto, pero el autocompletado no siempre elegirá la versión correcta.
John Montgomery
Como todavía recibo un error en tiempo de compilación cuando trato de usarlo, optionalString?isBlankes necesario desenvolverlo.
teradyl
1
Para mí, esto no funciona currentIncident.priority?.description.isBlank. Dice: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Tengo que hacer lo (currentIncident.priority?.description ?? "").isBlankque hace que las extensiones sean inútiles. Swift 4.1.
Carsten Hagemann el
1
@CarstenHagemann Eso es porque priorityes el opcional allí. Si solo descriptionfuera opcional, funcionaría, pero no puede evitar que un objeto primario sea opcional de esa manera (porque si priorityes nulo, ni siquiera tiene una descriptionpropiedad para verificar el vacío en primer lugar).
John Montgomery
9

Para hacer la comprobación nula y la longitud simultáneamente de Swift 2.0 y iOS 9 en adelante, puede usar

if(yourString?.characters.count > 0){}
MadNik
fuente
4

isEmpty hará lo que cree que hará, si string == "", devolverá verdadero. Algunas de las otras respuestas apuntan a una situación en la que tiene una cadena opcional.

¡POR FAVOR, use el encadenamiento opcional !

Si la cadena no es nula, se usará isEmpty, de lo contrario no se usará.

A continuación, la cadena opcional NO se establecerá porque la cadena es nula

let optionalString: String? = nil
if optionalString?.isEmpty == true {
     optionalString = "Lorem ipsum dolor sit amet"
}

Obviamente no usarías el código anterior. Las ganancias provienen del análisis JSON u otras situaciones en las que tiene un valor o no. Esto garantiza que el código se ejecutará si hay un valor.

Rápidamente
fuente
2

Comprobar comprobar solo espacios y caracteres de nueva línea en el texto

extension String
{
    var  isBlank:Bool {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).isEmpty
    }
}

utilizando

if text.isBlank
{
  //text is blank do smth
}
UnRewa
fuente
1

Para cadenas opcionales, ¿qué tal:

if let string = string where !string.isEmpty
{
    print(string)
}
PiXeL16
fuente
1
if myString?.startIndex != myString?.endIndex {}
Repartidor de hielo
fuente
0

Qué pasa

if let notEmptyString = optionalString where !notEmptyString.isEmpty {
    // do something with emptyString 
    NSLog("Non-empty string is %@", notEmptyString)
} else {
    // empty or nil string
    NSLog("Empty or nil string")
}
Jerome Chan Yeow Heong
fuente
0

Puedo recomendar agregar una pequeña extensión a String o Array que se vea como

extension Collection {
    public var isNotEmpty: Bool {
        return !self.isEmpty
    }
}

Con él puedes escribir código que sea más fácil de leer. Compara estas dos líneas

if !someObject.someParam.someSubParam.someString.isEmpty {}

y

if someObject.someParam.someSubParam.someString.isNotEmpty {}

¡Es fácil perderse ! firmar al comienzo de la primera línea.

Moonvader
fuente
0

Puedes usar esta extensión:

extension String {

    static func isNilOrEmpty(string: String?) -> Bool {
        guard let value = string else { return true }

        return value.trimmingCharacters(in: .whitespaces).isEmpty
    }

}

y luego úsalo así:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
rgreso
fuente