Controlla la stringa per zero e vuota


Risposte:


212

Se hai a che fare con stringhe opzionali, funziona:

(string ?? "").isEmpty

L' ??operatore di coalescenza zero restituisce il lato sinistro se è diverso da zero, altrimenti restituisce il lato destro.

Puoi anche usarlo in questo modo per restituire un valore predefinito:

(string ?? "").isEmpty ? "Default" : string!

3
Elegante ??? In pratica hai scritto "se la stringa non è nient'altro che stringa vuota e quella chiamata è vuota su quella ... Che dichiarazione logica.
Renetik

73

Potresti forse usare la clausola if-let-where:

Swift 3:

if let string = string, !string.isEmpty {
    /* string is not blank */
}

Swift 2:

if let string = string where !string.isEmpty {
    /* string is not blank */
}

2
Non funziona con Swift 2, ottenendo questo errore di runtime fatal error: unexpectedly found nil while unwrapping an Optional valuema la mia costante stringha dati stringa.
Nagendra Rao,

3
Funziona in Swift 3:if let string = string, !string.isEmpty { /* string is not blank */ }
EricS

1
@AmrLotfy guard letè un'alternativa se si desidera terminare il flusso di controllo sotto l'istruzione. Tuttavia nulla è da scartare nella clausola where (la! È una negazione booleana)
Ryan

che ne dici di questo! str? .isEmpty invece di string = string where! string.isEmpty
Pankaj

28

Se stai usando Swift 2, ecco un esempio del mio collega, che aggiunge la proprietà isNilOrEmpty su Stringhe opzionali:

protocol OptionalString {}
extension String: OptionalString {}

extension Optional where Wrapped: OptionalString {
    var isNilOrEmpty: Bool {
        return ((self as? String) ?? "").isEmpty
    }
}

È quindi possibile utilizzare isNilOrEmpty sulla stringa opzionale stessa

func testNilOrEmpty() {
    let nilString:String? = nil
    XCTAssertTrue(nilString.isNilOrEmpty)

    let emptyString:String? = ""
    XCTAssertTrue(emptyString.isNilOrEmpty)

    let someText:String? = "lorem"
    XCTAssertFalse(someText.isNilOrEmpty)
}

Potete per favore chiarire cosa avete fatto qui o alcune risorse che possono spiegarlo in dettaglio. Come perché è stato dichiarato OptionalString? Non sto ottenendo la sintassi. Non è come la normale implementazione di estensione So. Grazie mille in anticipo
Vinayak Parmar,

@VinayakParmar OptionalString è dichiarato qui perché è where Wrapped:necessario specificare un protocollo e non un tipo.
Adam Johns,

Forse si potrebbe chiamare isNilOrEmptya hasValue(o qualcosa di simile) e invertire la logica
l'Islam D.

28

Usando la guarddichiarazione

Stavo usando Swift per un po 'prima di conoscere la guarddichiarazione. Ora sono un grande fan. È usato in modo simile ifall'istruzione, ma consente un ritorno anticipato e rende il codice molto più pulito in generale.

Per usare guard quando si controlla per assicurarsi che una stringa non sia né nulla né vuota, è possibile effettuare le seguenti operazioni:

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 scartata la stringa facoltativa e viene verificato che non sia vuoto tutto in una volta. Se è zero (o vuoto), ritorni immediatamente dalla tua funzione (o ciclo) e tutto ciò che viene ignorato. Ma se l'istruzione guard passa, allora puoi tranquillamente usare la tua stringa da scartare.

Guarda anche


stai attento. print (myString) non funzionerà, se String è zero o vuoto, poiché guard è progettato per non cadere dopo essere entrato nella fase else.
Kang Byul,

@KangByul, è corretto ed è l'intento della logica qui. Presumibilmente se la stringa è nilo vuota, non si vorrebbe chiamare print(myString). Se avessi bisogno di continuare l'esecuzione dopo un nilo vuoto String, allora useresti if letpiuttosto che guard.
Suragch,

Grazie per un encomio. Lo so, lo dico solo ad altri che non sanno molto della guardia.
Kang Byul,

4
@KangByul Non capisco il punto del tuo commento "stai attento", penso che spaventa la gente da un'ottima soluzione, la dichiarazione di ritorno è chiaramente proprio nella dichiarazione della guardia, penso che dovresti cancellare il tuo commento
Brian Ogden

16

Con Swift 5, puoi implementare Optionalun'estensione per il Stringtipo con una proprietà booleana che ritorna se una stringa opzionale non ha valore o è vuota:

extension Optional where Wrapped == String {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}

Tuttavia, Stringimplementa la isEmptyproprietà conformandosi al protocollo Collection. Pertanto, possiamo sostituire il vincolo generico ( Wrapped == String) del codice precedente con uno più ampio ( Wrapped: Collection) in modo che Array, Dictionarye Setanche beneficiare della nostra nuova isNilOrEmptyproprietà:

extension Optional where Wrapped: Collection {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}

Utilizzo con Strings:

let optionalString: String? = nil
print(optionalString.isNilOrEmpty) // prints: true
let optionalString: String? = ""
print(optionalString.isNilOrEmpty) // prints: true
let optionalString: String? = "Hello"
print(optionalString.isNilOrEmpty) // prints: false

Utilizzo con Arrays:

let optionalArray: Array<Int>? = nil
print(optionalArray.isNilOrEmpty) // prints: true
let optionalArray: Array<Int>? = []
print(optionalArray.isNilOrEmpty) // prints: true
let optionalArray: Array<Int>? = [10, 22, 3]
print(optionalArray.isNilOrEmpty) // prints: false

fonti:


1
Mi piace questo, l'unica modifica che vorrei fare è rinominarlo da isNilOrEmptya isEmptyOrNilin modo che corrisponda al prefisso in modo che sia facilmente reperibile tramite lo stesso modello per il completamento automatico. Ho notato una maggiore adozione di questa estensione da parte dei colleghi con cui lavoro semplicemente trovandoli in questo modo.
Aaron,

14
var str: String? = nil

if str?.isEmpty ?? true {
    print("str is nil or empty")
}

str = ""

if str?.isEmpty ?? true {
    print("str is nil or empty")
}

1
Elegante ma imbarazzante;), il "vero" tipo butta via l'intuizione
TruMan1

9

So che ci sono molte risposte a questa domanda, ma nessuna di queste sembra essere conveniente come questa (secondo me) per convalidare i UITextFielddati, che è uno dei casi più comuni per usarli :

extension Optional where Wrapped == String {
    var isNilOrEmpty: Bool {
        return self?.trimmingCharacters(in: .whitespaces).isEmpty ?? true
    }
}

Puoi semplicemente usare

textField.text.isNilOrEmpty

Puoi anche saltare il .trimmingCharacters(in:.whitespaces)se non consideri gli spazi bianchi come una stringa vuota o usarlo per test di input più complessi come

var isValidInput: Bool {
    return !isNilOrEmpty && self!.trimmingCharacters(in: .whitespaces).characters.count >= MIN_CHARS
}

Ottima risposta, l'Op non ha precisato se gli spazi bianchi sono stati considerati vuoti, quindi ecco la mia versione: estensione pubblica Facoltativo dove Wrapped == String {var isEmptyOrNil: Bool {return (self ?? "") .isEmpty}}
sachadso

7

Io raccomanderei.

if stringA.map(isEmpty) == false {
    println("blah blah")
}

mapapplica l'argomento della funzione se l'opzione è .Some.
L'acquisizione del parco giochi mostra anche un'altra possibilità con il nuovo Swift 1.2 se si lascia l'associazione opzionale.

inserisci qui la descrizione dell'immagine


7

Se vuoi accedere alla stringa come non opzionale, dovresti usare la risposta di Ryan , ma se ti interessa solo la non vacuità della stringa, la mia scorciatoia preferita per questo è

if stringA?.isEmpty == false {
    ...blah blah
}

Dato che ==funziona bene con i booleani opzionali, penso che questo lasci il codice leggibile senza oscurare l'intenzione originale.

Se vuoi verificare il contrario: se la stringa è nilo "", preferisco controllare entrambi i casi in modo esplicito per mostrare l'intenzione corretta:

if stringA == nil || stringA?.isEmpty == true {
    ...blah blah
}

@ TruMan1 è corretto, l'obiettivo del primo esempio è verificare se la stringa non è vuota.
Alex Pretzlav,

4

SWIFT 3

extension Optional where Wrapped == String {

    /// Checks to see whether the optional string is nil or empty ("")
    public var isNilOrEmpty: Bool {
        if let text = self, !text.isEmpty { return false }
        return true
    }
}

Usa così su una stringa opzionale:

if myString.isNilOrEmpty { print("Crap, how'd this happen?") } 

4

Swift 3 Per controllare la stringa migliore nel modo migliore

if !string.isEmpty{

// do stuff

}

2

Puoi creare la tua funzione personalizzata, se è qualcosa che ti aspetti di fare molto.

func isBlank (optionalString :String?) -> Bool {
    if let string = optionalString {
        return string.isEmpty
    } else {
        return true
    }
}



var optionalString :String? = nil

if isBlank(optionalString) {
    println("here")
}
else {
    println("there")
}

2

Soluzione Swift 3 Utilizzare il valore non imballato opzionale e verificare il valore booleano.

if (string?.isempty == true) {
    // Perform action
}

2

Utilizzando isEmpty

"Hello".isEmpty  // false
"".isEmpty       // true

Utilizzando allSatisfy

extension String {
  var isBlank: Bool {
    return allSatisfy({ $0.isWhitespace })
  }
}

"Hello".isBlank        // false
"".isBlank             // true

Utilizzando una stringa opzionale

extension Optional where Wrapped == String {
  var isBlank: Bool {
    return self?.isBlank ?? true
  }
}

var title: String? = nil
title.isBlank            // true
title = ""               
title.isBlank            // true

Riferimento: https://useyourloaf.com/blog/empty-strings-in-swift/


1

Creare un'estensione della classe String:

extension String
{   //  returns false if passed string is nil or empty
    static func isNilOrEmpty(_ string:String?) -> Bool
    {   if  string == nil                   { return true }
        return string!.isEmpty
    }
}// extension: String

Si noti che questo restituirà VERO se la stringa contiene uno o più spazi vuoti. Per considerare la stringa vuota come "vuota", utilizzare ...

return string!.trimmingCharacters(in: CharacterSet.whitespaces).isEmpty

... anziché. Ciò richiede la Fondazione.

Usalo così ...

if String.isNilOrEmpty("hello world") == true 
{   print("it's a string!")
}

1

Swift 3 Funziona bene per verificare se la stringa è veramente vuota. Perché isEmpty ritorna vero quando c'è uno spazio bianco.

extension String {
    func isEmptyAndContainsNoWhitespace() -> Bool {
        guard self.isEmpty, self.trimmingCharacters(in: .whitespaces).isEmpty
            else {
               return false
        }
        return true
    }
}

Esempi:

let myString = "My String"
myString.isEmptyAndContainsNoWhitespace() // returns false

let myString = ""
myString.isEmptyAndContainsNoWhitespace() // returns true

let myString = " "
myString.isEmptyAndContainsNoWhitespace() // returns false

1

Dovresti fare qualcosa del genere:
if !(string?.isEmpty ?? true) { //Not nil nor empty }

L'operatore a coalescenza zero verifica se l'opzione non è nulla, nel caso in cui non sia nulla quindi controlla la sua proprietà, in questo caso è vuota. Poiché questa opzione può essere nulla, si fornisce un valore predefinito che verrà utilizzato quando l'opzione è nulla.


1

Questa è una soluzione generale per tutti i tipi conformi al Collectionprotocollo, che include String:

extension Optional where Wrapped: Collection {
    var isNilOrEmpty: Bool {
        self?.isEmpty ?? true
    }
}

0

Quando ho a che fare con il passaggio di valori dal db locale al server e viceversa, ho avuto troppi problemi con? E se! E cosa no.

Così ho creato un'utilità Swift3.0 per gestire casi nulli e posso quasi completamente evitare? 'E!' 'Nel codice.

func str(_ string: String?) -> String {
    return (string != nil ? string! : "")
}

Ex:-

Prima :

    let myDictionary: [String: String] = 
                      ["title": (dbObject?.title != nil ? dbObject?.title! : "")]

Dopo :

    let myDictionary: [String: String] = 
                        ["title": str(dbObject.title)]

e quando è richiesto per verificare una stringa valida,

    if !str(dbObject.title).isEmpty {
        //do stuff
    }

Questo mi ha risparmiato di dover affrontare il problema di aggiungere e rimuovere numerosi? 'E!' Dopo aver scritto il codice che ha ragionevolmente senso.


0

Utilizzare l'operatore ternario (noto anche come operatore condizionale, C++ forever!):

if stringA != nil ? stringA!.isEmpty == false : false { /* ... */ }

Lo stringA!scartamento forzato avviene solo quando stringA != nil, quindi è sicuro. La == falseverbosità è in qualche modo più leggibile di un altro punto esclamativo in !(stringA!.isEmpty).

Personalmente preferisco una forma leggermente diversa:

if stringA == nil ? false : stringA!.isEmpty == false { /* ... */ }

Nell'affermazione precedente, è immediatamente chiaro che l'intero ifblocco non viene eseguito quando una variabile è nil.


0

utile quando si ottiene valore da UITextField e si verifica la presenza di nil& emptystring

@IBOutlet weak var myTextField: UITextField!

Ecco la tua funzione (quando tocchi a button) che ottiene la stringa da UITextField e fa alcune altre cose

@IBAction func getStringFrom_myTextField(_ sender: Any) {

guard let string = myTextField.text, !(myTextField.text?.isEmpty)!  else { return }
    //use "string" to do your stuff.
}

Questo si occuperà del nilvalore e della emptystringa.

Ha funzionato perfettamente per me.


0

Secondo me, il modo migliore per controllare lo zero e la stringa vuota è prendere il conteggio delle stringhe.

var nilString : String?
print(nilString.count) // count is nil

var emptyString = ""
print(emptyString.count) // count is 0

// combine both conditions for optional string variable
if string?.count == nil || string?.count == 0 {
   print("Your string is either empty or nil")
}

-4

puoi usare questa funzione

 class func stringIsNilOrEmpty(aString: String) -> Bool { return (aString).isEmpty }

2
Non un utente rapido; potresti spiegare perché questo non genera un'eccezione se si passa a zero?
Foon,

Non genera un'eccezione perché non è possibile passare nila questa funzione (tranne che da objc, nel qual caso si bloccherà effettivamente).
Alfonso,

Questo non risponde alla domanda. Non verifica lo zero in quanto non accetta un optional
Wayne Ellery,
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.