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?

chrisjlee
fonte
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" .

chrisjlee
fonte
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
Atualização: Aqui está isEmpty: developer.apple.com/documentation/swift/string/2946268-isempty
chrisjlee
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")
}
Albert Bori
fonte
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.

Suragch
fonte
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")
}
Saranjith
fonte
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
Evgenii
fonte
7
E como uma extensão ... gist.github.com/danielgomezrico/f852114508c1cfaaa849
Daniel Gomez Rico
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.

John Montgomery
fonte
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){}
MadNik
fonte
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.

Rapidamente
fonte
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
}
UnRewa
fonte
1

Para Strings opcionais, que tal:

if let string = string where !string.isEmpty
{
    print(string)
}
PiXeL16
fonte
1
if myString?.startIndex != myString?.endIndex {}
IceMan
fonte
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")
}
Jerome Chan Yeow Heong
fonte
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.

moonvader
fonte
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)
rgreso
fonte