Sprawdzić pusty ciąg w Swift?

165

W celu C można wykonać następujące czynności, aby sprawdzić ciągi:

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

Jak można wykryć puste ciągi w języku Swift?

chrisjlee
źródło
3
Twój kod celu jest nieprawidłowy. Zawodzi źle dla nil stringów. W celu C faktycznie używa się: if (myString.length) {'to łańcuch o długości}. Działa to również na ciągach zerowych. To proste i łatwe do odczytania.
Tom Andersen

Odpowiedzi:

241

Istnieje teraz wbudowana możliwość wykrywania pustego ciągu za pomocą .isEmpty:

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

Dokumentacja Apple w wersji wstępnej: „Ciągi znaków i znaki” .

chrisjlee
źródło
1
Możesz także użyć isEqualToString, co przydaje się, jeśli inicjujesz var przy użyciu NSString ('var emptyString: NSString'): emptyString.isEqualToString ("")
Sven
1
warunek ten kończy się niepowodzeniem, gdy użytkownik wprowadza spacje.
Shanu Singh
Aktualizacja: Here's isEmpty: developer.apple.com/documentation/swift/string/2946268-isempty
chrisjlee
108

Zwięzły sposób sprawdzenia, czy łańcuch jest zerowy lub pusty, to:

var myString: String? = nil

if (myString ?? "").isEmpty {
    print("String is nil or empty")
}
Albert Bori
źródło
To jest piękne, ale jak wykorzystasz nieopakowaną wartość? Wymusić rozpakowanie?
Nostalg.io
5
@halfnibble Możesz to zrobić (niejawne lub wymuszone rozpakowanie) lub możesz:if let myString = myString where !myString.isEmpty { ... }
Albert Bori
52

Całkowicie przepisuję swoją odpowiedź ( ponownie ). Tym razem to dlatego, że stałem się fanem guardwypowiedzi i wczesnego powrotu . To sprawia, że ​​kod jest znacznie czystszy.

Ciąg nieopcjonalny

Sprawdź długość zerową.

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)

Jeśli ifinstrukcja przejdzie pomyślnie, możesz bezpiecznie użyć ciągu, wiedząc, że nie jest on pusty. Jeśli jest pusty, funkcja wróci wcześniej i nic nie będzie miało znaczenia.

Opcjonalny ciąg

Sprawdź długość zerową lub zerową.

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)

Spowoduje to rozpakowanie opcjonalnego i sprawdzenie, czy nie jest on jednocześnie pusty. Po przekazaniu guardinstrukcji możesz bezpiecznie użyć nieopakowanego niepustego ciągu.

Suragch
źródło
40

W Xcode 11.3 swift 5.2 i nowszych

Posługiwać się

var isEmpty: Bool { get } 

Przykład

let lang = "Swift 5"

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

Jeśli chcesz zignorować spacje

if lang.trimmingCharacters(in: .whitespaces).isEmpty {
   print("Empty string")
}
Saranjith
źródło
2
Czy jest różnica między Twoją odpowiedzią a tą z wyjątkiem?
Ahmad F
To nie działa, jeśli użytkownik po prostu wejdzie w kilka spacji.
Supertecnoboff
2
W typografii spacje są traktowane jako znak, więc nie są puste. Jeśli chcesz, zmień warunek na „lang.trimmingCharacters (in: .whitespaces) .isEmpty”
Saranjith
28

Oto jak sprawdzam, czy ciąg jest pusty. Przez „pusty” rozumiem ciąg, który jest albo pusty, albo zawiera tylko znaki spacji / nowej linii.

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

Jak używać:

MyString.blank(" ") // true
Evgenii
źródło
7
A jako rozszerzenie ... gist.github.com/danielgomezrico/f852114508c1cfaaa849
Daniel Gomez Rico
2
Jako dodatek możesz rozważyć użycie białych spacjiAndNewlineCharacterSet zamiast zwykłych białych znaków.
fwielstra
1
dzięki @fwielstra, ignorowanie nowych wierszy również będzie bardzo przydatne.
Evgenii
14

Możesz także użyć opcjonalnego rozszerzenia, aby nie martwić się o rozpakowywanie lub używanie == 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
        }
    }
}

Uwaga: wywołując to jako opcjonalne, upewnij się, że nie używasz, ?bo w przeciwnym razie nadal będzie wymagało rozpakowania.

John Montgomery
źródło
1
Byłem tym podekscytowany, ale to nie zadziałało :( Jestem na Swift 3.0
teradyl
@teradyl Mówiąc „nie zadziałało”, masz na myśli, że otrzymujesz błąd, masz problemy z autouzupełnianiem, czy coś innego? Powinno działać, chyba że coś się zmieniło, o czym nie jestem świadomy, ale autouzupełnianie nie zawsze wybierze właściwą wersję.
John Montgomery,
Ponieważ nadal otrzymuję błąd kompilacji, gdy próbuję użyć optionalString?isBlank, należy go rozpakować.
teradyl,
1
Dla mnie to nie działa currentIncident.priority?.description.isBlank. Mówi: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Muszę zrobić, (currentIncident.priority?.description ?? "").isBlankco sprawia, że ​​rozszerzenia są trochę bezcelowe. Swift 4.1.
Carsten Hagemann
1
@CarstenHagemann To dlatego, że priorityjest to opcja. Gdyby descriptionbyło opcjonalne, zadziałałoby, ale nie można obejść tego, że obiekt nadrzędny jest opcjonalny w ten sposób (ponieważ jeśli priorityjest nil, to nie ma nawet descriptionwłaściwości sprawdzającej, czy nie ma pustości).
John Montgomery,
9

Aby wykonać zerową kontrolę i długość jednocześnie, Swift 2.0 i iOS 9 i nowsze wersje, możesz użyć

if(yourString?.characters.count > 0){}
MadNik
źródło
4

isEmpty zrobi to, co myślisz, że jeśli string == "", zwróci wartość true. Niektóre inne odpowiedzi wskazują na sytuację, w której masz opcjonalny ciąg.

PROSZĘ użyj opcjonalnego łączenia !!!!

Jeśli ciąg nie jest nil, zostanie użyty isEmpty, w przeciwnym razie nie.

Poniżej opcjonalny ciąg NIE zostanie ustawiony, ponieważ ciąg jest zerowy

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

Oczywiście nie użyłbyś powyższego kodu. Zyski pochodzą z analizowania JSON lub innych takich sytuacji, w których albo masz wartość, albo nie. Gwarantuje to, że kod zostanie uruchomiony, jeśli istnieje wartość.

Szybko
źródło
2

Sprawdź, czy w tekście nie ma tylko spacji i znaków nowej linii

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

za pomocą

if text.isBlank
{
  //text is blank do smth
}
UnRewa
źródło
1

W przypadku opcjonalnych ciągów, co powiesz na:

if let string = string where !string.isEmpty
{
    print(string)
}
PiXeL16
źródło
1
if myString?.startIndex != myString?.endIndex {}
Lodziarz
źródło
0

Co powiesz na

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
źródło
0

Mogę polecić dodanie małego rozszerzenia do String lub Array, które wygląda jak

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

Dzięki niemu możesz napisać kod, który jest łatwiejszy do odczytania. Porównaj te dwie linie

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

i

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

Łatwo go przegapić ! zarejestruj się na początku pierwszej linii.

moonvader
źródło
0

Możesz użyć tego rozszerzenia:

extension String {

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

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

}

a następnie użyj tego w ten sposób:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
rgreso
źródło