Перевірити порожній рядок у Swift?


165

У цілі C можна зробити наступне, щоб перевірити наявність рядків:

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

Як можна виявити порожні рядки в Swift?


3
Ваш об'єктивний код неправильний. Він погано підходить для нульових струн. У цілі C фактично використовується: if (myString.length) {'його рядок з довжиною}. Це працює і на нульових струнах. Це просто і легко для читання.
Том Андерсен

Відповіді:


241

Зараз існує вбудована здатність виявляти порожній рядок за допомогою .isEmpty:

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

Документація до випуску Apple: "Рядки та символи" .


1
Ви можете також використовувати isEqualToString, що дуже зручно , якщо ви ініціалізації вар з NSString ( «вар emptyString: NSString»): emptyString.isEqualToString ( «»)
Свен

1
ця умова не вдається, коли користувач вводить пробіли.
Шану Сінгх


108

Короткий спосіб перевірити, чи є рядок нульовим чи порожнім:

var myString: String? = nil

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

Це прекрасно, але як би ви використали нерозгорнуте значення? Примусово розмотати?
Nostalg.io

5
@halfnibble Ви можете зробити це (неявне або вимушене видалення) або ви могли:if let myString = myString where !myString.isEmpty { ... }
Альберт Борі

52

Я повністю переписую свою відповідь ( знову ). Цього разу це тому, що я став прихильником guardзаяви і раннього повернення . Це робить набагато чистішим код.

Необов'язковий рядок

Перевірте нульову довжину.

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)

Якщо ifоператор проходить, то ви можете сміливо використовувати рядок, знаючи, що він не порожній. Якщо вона порожня, функція повернеться рано і нічого не має після цього.

Додатковий рядок

Перевірте наявність нульової або нульової довжини.

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)

Це розгортає необов’язковий і перевіряє, чи не є воно одночасно порожнім. Після передачі guardзаяви ви можете сміливо користуватися вашим розгорнутим непустим рядком.


40

У Xcode 11.3 стрімко 5.2 та пізніших версій

Використовуйте

var isEmpty: Bool { get } 

Приклад

let lang = "Swift 5"

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

Якщо ви хочете ігнорувати пробіли

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

2
Чи є різниця між вашою відповіддю та виключеною?
Ахмад Ф

Це не працює, якщо користувач просто вводить купу пробілів.
Supertecnoboff

2
У друкарні пробіли розглядаються як персонаж, тому його не порожньо. Якщо ви хочете, то змініть умову на 'lang.trimmingCharacters (in: .whitespaces) .isEmpty'
Саранджіт

28

Ось як я перевіряю, чи рядок порожнім. Під «порожнім» я маю на увазі рядок, який або порожній, або містить лише пробіли / символи нового рядка.

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

Як використовувати:

MyString.blank(" ") // true


2
В якості додатку ви можете розглянути можливість використання пробілівAndNewlineCharacterSet замість простого пробілу.
fwielstra

1
дякую @fwielstra, ігнорування нових рядків також буде дуже корисним.
Євгеній

14

Ви також можете скористатись додатковим розширенням, щоб не потрібно було турбуватися про розгортання чи використання == 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
        }
    }
}

Примітка. Якщо дзвонити це на необов'язково, переконайтеся, що його не використовують, ?інакше все-таки буде потрібно розгортання.


1
Я схвильований з цього приводу, але це не вийшло :( Я на Swift 3.0
teradyl

@teradyl Під "не вдалося", ви маєте на увазі, що ви отримуєте помилку, виникаєте проблеми з автозаповненням чи щось інше? Він повинен працювати, якщо щось не змінилося, про що я не знаю, але автозаповнення не завжди вибирає правильну версію.
Джон Монтгомері

Як і у мене, як і раніше я отримую помилку під час компіляції, коли я намагаюся використовувати, optionalString?isBlankщо її потрібно розгортати.
Тераділ

1
Для мене це не працює currentIncident.priority?.description.isBlank. Каже: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Я маю робити, (currentIncident.priority?.description ?? "").isBlankщо робить розширення сорту безглуздим. Швидкий 4.1.
Карстен Хагеман

1
@CarstenHagemann Це тому priority, що там необов'язково. Якби просто descriptionбуло необов’язково, воно працювало б, але ви не можете обійти батьківський об'єкт, який є таким, як необов'язковий (тому що, якщо priorityнуль, то він навіть не має descriptionвластивості перевіряти порожнечу).
Джон Монтгомері

9

Щоб зробити нульову перевірку та довжину одночасно, натисніть Swift 2.0 та iOS 9 далі

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

4

isEmpty зробить так, як ви думаєте, що буде, якщо рядок == "", він поверне справжнє значення. Деякі з інших відповідей вказують на ситуацію, коли у вас є необов'язковий рядок.

ВИМОГАЙТЕ використання додаткового ланцюга !!!!

Якщо рядок не дорівнює нулю, буде використано isEmpty, інакше не буде.

Нижче, optionalString НЕ буде встановлений, оскільки рядок дорівнює нулю

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

Очевидно, ви б не використовували наведений вище код. Виграш приходить від розбору JSON або інших подібних ситуацій, коли ти маєш цінність чи ні. Цей код гарантій буде запущений, якщо є значення.


2

Перевірте, чи в тексті є лише пробіли та символи нових рядків

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

використовуючи

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

1

Для додаткових рядків як щодо:

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


0

А як на рахунок

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

Я можу рекомендувати додати невелике розширення до String або Array, що виглядає так

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

З його допомогою ви можете написати код, який легше читати. Порівняйте ці два рядки

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

і

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

Це легко пропустити ! підписати на початку рядка кулак.


0

Ви можете використовувати це розширення:

extension String {

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

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

}

а потім використовуйте його так:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.