Controlla la stringa vuota in Swift?


165

Nell'obiettivo C, si potrebbe fare quanto segue per controllare le stringhe:

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

Come si rilevano le stringhe vuote in Swift?


3
Il tuo codice obiettivo è sbagliato. Fallisce male per le stringhe zero. Nell'obiettivo C si usa effettivamente: if (myString.length) {'è una stringa con lunghezza}. Funziona anche su stringhe zero. È semplice e facile da leggere.
Tom Andersen,

Risposte:


240

Ora c'è la possibilità integrata di rilevare una stringa vuota con .isEmpty:

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

Documentazione preliminare di Apple: "Stringhe e caratteri" .


1
Puoi anche usare isEqualToString, che è utile se stai inizializzando var con NSString ('var emptyString: NSString'): emptyString.isEqualToString ("")
Sven

1
questa condizione non riesce quando l'utente inserisce spazi.
Shanu Singh,


108

Un modo conciso per verificare se la stringa è nulla o vuota sarebbe:

var myString: String? = nil

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

Questo è bello, ma come useresti il ​​valore da scartare? Forza di scartare?
Nostalg.io,

5
@halfnibble Puoi fare (implicita o forzata da scartare) oppure potresti fare:if let myString = myString where !myString.isEmpty { ... }
Albert Bori,

52

Sto riscrivendo completamente la mia risposta (di nuovo ). Questa volta è perché sono diventato un fan della guarddichiarazione e ritorno presto . Rende il codice molto più pulito.

Stringa non opzionale

Verificare la lunghezza 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 l' ifistruzione passa, puoi tranquillamente utilizzare la stringa sapendo che non è vuota. Se è vuoto, la funzione tornerà presto e nulla dopo che sarà importante.

Stringa opzionale

Verificare la lunghezza zero o 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)

In questo modo viene scartato il componente opzionale e viene verificato che non sia vuoto allo stesso tempo. Dopo aver passato l' guardistruzione, puoi tranquillamente utilizzare la stringa non vuota non imballata.


40

In Xcode 11.3 swift 5.2 e versioni successive

Uso

var isEmpty: Bool { get } 

Esempio

let lang = "Swift 5"

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

Se vuoi ignorare gli spazi bianchi

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

2
C'è una differenza tra la tua risposta e quella esclusa?
Ahmad F,

Questo non funziona se l'utente inserisce solo un mucchio di spazi.
Supertecnoboff,

2
Nella tipografia gli spazi bianchi sono considerati come un personaggio, quindi non sono vuoti. Se lo desideri, modifica la condizione in "lang.trimmingCharacters (in: .whitespaces) .isEmpty"
Saranjith

28

Ecco come controllo se la stringa è vuota. Per "vuoto" intendo una stringa che è vuota o contiene solo spazi / caratteri di nuova riga.

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

Come usare:

MyString.blank(" ") // true


2
Come addendum, potresti prendere in considerazione l'utilizzo di whitespaceAndNewlineCharacterSet invece che solo di spazi bianchi.
fwielstra,

1
grazie @fwielstra, anche ignorare le nuove righe sarà molto utile.
Evgenii,

14

Puoi anche usare un'estensione opzionale in modo da non doverti preoccupare di scartare o usare == 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: quando si chiama questo su un opzionale, assicurarsi di non utilizzare ?altrimenti richiederà comunque lo scartamento.


1
Sono eccitato per questo, ma non ha funzionato :( Sono su Swift 3.0
teradyl,

@teradyl Per "non ha funzionato", vuoi dire che stai ricevendo un errore, hai problemi con il completamento automatico o qualcos'altro? Dovrebbe funzionare a meno che non sia cambiato qualcosa di cui non sono a conoscenza, ma il completamento automatico non sceglierà sempre la versione giusta.
John Montgomery,

Come in, ricevo ancora un errore in fase di compilazione quando provo ad usarlo optionalString?isBlankche deve essere scartato.
teradyl

1
Per me questo non funziona currentIncident.priority?.description.isBlank. Dice: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Devo fare (currentIncident.priority?.description ?? "").isBlankche rende le estensioni quasi inutili. Rapido 4.1.
Carsten Hagemann,

1
@CarstenHagemann Ecco perché priorityè facoltativo lì. Se solo descriptionfosse facoltativo, funzionerebbe, ma non è possibile aggirare un oggetto genitore che sia facoltativo in quel modo (perché se priorityè nullo, allora non ha nemmeno una descriptionproprietà per controllare lo spazio vuoto in primo luogo).
John Montgomery,

9

Per eseguire il controllo zero e la lunghezza contemporaneamente Swift 2.0 e iOS 9 in poi è possibile utilizzare

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

4

isEmpty farà come pensi che, se string == "", tornerà vero. Alcune delle altre risposte indicano una situazione in cui si dispone di una stringa facoltativa.

Si prega di utilizzare il concatenamento opzionale !!!!

Se la stringa non è nulla, verrà utilizzato isEmpty, altrimenti no.

Di seguito, opzionaleString NON verrà impostato perché la stringa è nulla

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

Ovviamente non useresti il ​​codice sopra. I guadagni provengono dall'analisi JSON o da altre situazioni simili in cui si ha un valore oppure no. Questo codice di garanzia verrà eseguito se esiste un valore.


2

Controlla controlla solo gli spazi e i caratteri di nuova riga nel testo

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

utilizzando

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

1

Per stringhe opzionali che ne dici di:

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


0

Che dire

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 consigliare di aggiungere una piccola estensione a String o Array che assomiglia

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

Con esso puoi scrivere codice che è più facile da leggere. Confronta queste due righe

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

e

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

È facile perdere ! accedi all'inizio della linea del pugno.


0

Puoi usare questa estensione:

extension String {

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

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

}

e poi usalo in questo modo:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.