Verificar string vazia no Swift?


165

No Objetivo C, pode-se fazer o seguinte para verificar se há strings:

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

Como se detecta strings vazias no Swift?


3
Seu código objetivo está errado. Ele falha muito para zero strings. No objetivo C, na verdade, usa-se: if (myString.length) {'é uma string com comprimento}. Isso funciona também em cadeias nulas. É simples e fácil de ler.
Tom Andersen

Respostas:


240

Agora existe a capacidade integrada de detectar uma string vazia com .isEmpty:

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

Documentação de pré-lançamento da Apple: "Strings and Characters" .


1
Você também pode usar o isEqualToString, que é útil se você estiver inicializando o var com NSString ('var emptyString: NSString'): emptyString.isEqualToString ("")
Sven

1
essa condição falha quando o usuário insere espaços.
Shanu Singh 29/02


108

Uma maneira concisa de verificar se a sequência é nula ou vazia seria:

var myString: String? = nil

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

Isso é lindo, mas como você usaria o valor desembrulhado? Forçar desembrulhar?
Nostalg.io

5
@halfnibble Você pode fazer tanto (unwrap implícita ou forçada) ou você pode fazer:if let myString = myString where !myString.isEmpty { ... }
Albert Bori

52

Estou reescrevendo completamente minha resposta ( novamente ). Desta vez é porque me tornei fã da guarddeclaração e retorno antecipado . Isso cria um código muito mais limpo.

Sequência não opcional

Verifique o comprimento zero.

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)

Se a ifinstrução for aprovada, você poderá usar a string com segurança, sabendo que ela não está vazia. Se estiver vazio, a função retornará mais cedo e nada depois que importa.

Sequência opcional

Verifique o comprimento nulo ou zero.

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)

Isso desembrulha o opcional e verifica se ele não está vazio ao mesmo tempo. Depois de passar a guardinstrução, você pode usar com segurança sua seqüência de caracteres não vazia não empacotada.


40

No Xcode 11.3 swift 5.2 e posterior

Usar

var isEmpty: Bool { get } 

Exemplo

let lang = "Swift 5"

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

Se você deseja ignorar espaços em branco

if lang.trimmingCharacters(in: .whitespaces).isEmpty {
   print("Empty string")
}

2
Existe uma diferença entre sua resposta e a exceção?
Ahmad F

Isso não funciona se o usuário apenas inserir vários espaços.
Supertecnoboff

2
Na tipografia, os espaços em branco são considerados como caracteres, portanto, não estão vazios. Se você quer, então condição mude para 'lang.trimmingCharacters (in: .whitespaces) .isEmpty'
Saranjith

28

Aqui está como eu verifico se a string está em branco. Por 'em branco', quero dizer uma string que está vazia ou contém apenas caracteres de espaço / nova linha.

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

Como usar:

MyString.blank(" ") // true


2
Como adendo, considere usar o espaço em brancoAndNewlineCharacterSet em vez de apenas espaço em branco.
precisa saber é o seguinte

1
obrigado @fwielstra, ignorar novas linhas também será muito útil.
precisa

14

Você também pode usar uma extensão opcional para não precisar se preocupar em desembrulhar ou 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: ao chamar isso como opcional, certifique-se de não usá ?-lo; caso contrário, ainda será necessário desembrulhar.


1
Fiquei animado com isso, mas não funcionou :( Estou no Swift 3.0
teradyl

@teradyl Por "não funcionou", você quer dizer que está recebendo um erro, tendo problemas com o preenchimento automático ou algo mais? Deveria funcionar, a menos que algo mudasse e que eu não soubesse, mas o preenchimento automático nem sempre escolhe a versão correta.
John Montgomery

Como ainda recebo um erro em tempo de compilação quando tento usá- optionalString?isBlanklo, que precisa ser desembrulhado.
teradyl

1
Para mim, isso não está funcionando currentIncident.priority?.description.isBlank. Diz: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Eu tenho que fazer o (currentIncident.priority?.description ?? "").isBlankque torna as extensões meio inúteis. Swift 4.1.
Carsten Hagemann

1
@CarstenHagemann Isso é porque priorityé o opcional lá. Se apenas descriptionfosse opcional, funcionaria, mas você não pode contornar um objeto pai sendo opcional assim (porque se priorityfor nulo, ele nem sequer tem uma descriptionpropriedade para verificar a inexistência de espaços em primeiro lugar).
John Montgomery

9

Para fazer a verificação e o comprimento nulos simultaneamente, o Swift 2.0 e o iOS 9 em diante, você pode usar

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

4

isEmpty fará o que você pensa que, se string == "", retornará verdadeiro. Algumas das outras respostas apontam para uma situação em que você tem uma sequência opcional.

POR FAVOR, use o encadeamento opcional !!!!

Se a sequência não for nula, isEmpty será usado, caso contrário, não será.

Abaixo, o opcionalString NÃO será definido porque o string é nulo

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

Obviamente você não usaria o código acima. Os ganhos vêm da análise JSON ou de outras situações em que você tem um valor ou não. Este código de garantias será executado se houver um valor.


2

Marque a verificação apenas para caracteres de espaços e novas linhas no texto

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

usando

if text.isBlank
{
  //text is blank do smth
}

1

Para Strings opcionais, que tal:

if let string = string where !string.isEmpty
{
    print(string)
}

1
if myString?.startIndex != myString?.endIndex {}

0

A respeito

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

0

Posso recomendar adicionar uma pequena extensão a String ou Array que se pareça com

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

Com ele, você pode escrever um código mais fácil de ler. Compare estas duas linhas

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

e

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

É fácil perder ! Cadastre-se no início da linha do punho.


0

Você pode usar esta extensão:

extension String {

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

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

}

e use-o assim:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.