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.