Проверить строку на ноль и пусто

Есть ли способ проверить строки на nil и "" в Swift? В Rails я могу использовать blank() для проверки.

В настоящее время у меня есть это, но кажется излишним:

    if stringA? != nil {
        if !stringA!.isEmpty {
            ...blah blah
        }
    }

person Dean    schedule 01.04.2015    source источник
comment
возможный дубликат Разверните строку и проверьте пустоту в том же случае, если заявление   -  person rintaro    schedule 01.04.2015
comment
(@sutra и @ imanou-petit) ответы лучше.   -  person Mr. Ming    schedule 06.05.2019


Ответы (25)


Если вы имеете дело с необязательными строками, это работает:

(string ?? "").isEmpty

Оператор объединения ?? nil возвращает левую часть, если она не равна нулю, в противном случае возвращает правую часть.

Вы также можете использовать его так, чтобы вернуть значение по умолчанию:

(string ?? "").isEmpty ? "Default" : string!
person jrc    schedule 30.09.2015
comment
в чем преимущество использования isEmpty по сравнению с == сравнением? Спасибо за Ваш ответ - person Manish Jain; 23.06.2021

Возможно, вы могли бы использовать предложение 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 */
}
person Ryan    schedule 06.08.2015
comment
Не работает со Swift 2, возникает эта ошибка времени выполнения fatal error: unexpectedly found nil while unwrapping an Optional value, но моя константа string имеет строковые данные. - person Nagendra Rao; 17.10.2015
comment
Это работает в Swift 3: if let string = string, !string.isEmpty { /* string is not blank */ } - person EricS; 07.12.2016
comment
@AmrLotfy guard let - альтернатива, если вы хотите завершить поток управления ниже инструкции. Однако здесь ничего не разворачивается в предложении where (! - это логическое отрицание) - person Ryan; 10.07.2017
comment
так как насчет этого! str? .isEmpty вместо string = string, где! string.isEmpty - person Pankaj; 11.05.2018

Использование guard заявление

Некоторое время я использовал Swift, прежде чем узнал о _ 2_ инструкция. Теперь я большой поклонник. Он используется аналогично _ 3_, но он позволяет досрочно вернуть и просто делает код намного чище в целом.

Чтобы использовать охрану при проверке, чтобы убедиться, что строка не пуста и не пуста, вы можете сделать следующее:

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)

Это разворачивает необязательную строку и сразу проверяет, не пуста ли она. Если оно равно нулю (или пусто), вы немедленно возвращаетесь из своей функции (или цикла), и все, что находится после него, игнорируется. Но если оператор защиты проходит, вы можете безопасно использовать развернутую строку.

Смотрите также

person Suragch    schedule 06.05.2016
comment
будь осторожен. print (myString) не будет запускаться, если String имеет значение nil или пусто, потому что защита разработана так, чтобы не упасть после перехода в фазу else. - person Kang Byul; 15.02.2017
comment
@KangByul, это правильно, и в этом суть логики. Предположительно, если строка nil или пуста, не следует вызывать print(myString). Если вам нужно продолжить выполнение после nil или пустого String, вы должны использовать if let, а не guard. - person Suragch; 15.02.2017
comment
Спасибо за похвалу. Я знаю, я просто говорю тем, кто мало что знает о страже. - person Kang Byul; 15.02.2017
comment
@KangByul Я не понимаю смысл вашего осторожного комментария, я думаю, что это отпугивает людей от отличного решения, оператор return явно прав в операторе guard else, я думаю, вам следует удалить свой комментарий - person Brian Ogden; 28.05.2017

Если вы используете Swift 2, вот пример, который придумал мой коллега, который добавляет свойство isNilOrEmpty в необязательные строки:

protocol OptionalString {}
extension String: OptionalString {}

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

Затем вы можете использовать isNilOrEmpty в самой необязательной строке

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

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

    let someText:String? = "lorem"
    XCTAssertFalse(someText.isNilOrEmpty)
}
person Ken Ko    schedule 08.10.2015
comment
Не могли бы вы пояснить, что вы делали здесь, или какой-нибудь ресурс, который может объяснить это подробно. Например, почему объявлен OptionalString? Я не получаю синтаксис. Это не похоже на обычную реализацию расширения. Итак. Заранее большое спасибо - person Vinayak Parmar; 11.11.2016
comment
@VinayakParmar OptionalString объявлен здесь, потому что where Wrapped: должен указывать протокол, а не тип. - person Adam Johns; 16.12.2016
comment
Может быть, вы могли бы назвать isNilOrEmpty hasValue (или что-то в этом роде) и изменить логику - person Islam Q.; 06.03.2017

В Swift 5 вы можете реализовать расширение Optional для типа String с логическим свойством, которое возвращает, если необязательная строка пуста или не имеет значения:

extension Optional where Wrapped == String {

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

}

Однако String реализует свойство isEmpty в соответствии с протоколом Collection. Поэтому мы можем заменить общее ограничение предыдущего кода (Wrapped == String) на более широкое (Wrapped: Collection), чтобы Array, Dictionary и Set также использовали наше новое свойство isEmptyOrNil:

extension Optional where Wrapped: Collection {

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

}

Использование с Strings:

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

Использование с Arrays:

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

Источники:

person Imanou Petit    schedule 23.01.2019
comment
Мне это нравится, единственная настройка, которую я бы сделал, - это переименовать его с isNilOrEmpty в isEmptyOrNil в соответствии с префиксом, чтобы его можно было легко найти с помощью того же шаблона для автозаполнения. Я заметил, что коллеги, с которыми я работаю, все чаще используют это расширение, просто потому, что они нашли его таким образом. - person Aaron; 17.05.2020

Я знаю, что на этот вопрос есть много ответов, но ни один из них не кажется столь же удобным, как это (на мой взгляд) для проверки данных UITextField, что является одним из наиболее распространенных случаев их использования:

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

Вы можете просто использовать

textField.text.isNilOrEmpty

Вы также можете пропустить .trimmingCharacters(in:.whitespaces), если вы не рассматриваете пробелы как пустую строку или не используете их для более сложных входных тестов, таких как

var isValidInput: Bool {
    return !isNilOrEmpty && self!.trimmingCharacters(in: .whitespaces).characters.count >= MIN_CHARS
}
person Sir Codesalot    schedule 12.11.2017
comment
Отличный ответ, Op не уточнил, считаются ли пробелы пустыми, поэтому вот моя версия: public extension Optional where Wrapped == String {var isEmptyOrNil: Bool {return (self ??) .isEmpty}} - person sachadso; 19.07.2018

Я бы порекомендовал.

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

map применяет аргумент функции, если необязательным является .Some.
Захват игровой площадки также показывает другую возможность с новым Swift 1.2, если позволяет необязательная привязка.

введите описание изображения здесь

person Price Ringo    schedule 01.04.2015

Если вы хотите получить доступ к строке как к необязательной, вам следует использовать ответ Райана, но если вас интересует только непустота строки, я предпочитаю сокращать это

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

Поскольку == отлично работает с необязательными логическими значениями, я думаю, что это оставляет код читабельным, не скрывая первоначального намерения.

Если вы хотите проверить обратное: если строка nil или "", я предпочитаю явно проверить оба случая, чтобы показать правильное намерение:

if stringA == nil || stringA?.isEmpty == true {
    ...blah blah
}
person Alex Pretzlav    schedule 08.12.2015
comment
@ TruMan1 правильно, цель первого примера - проверить, не ли строка пуста. - person Alex Pretzlav; 06.05.2016

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
    }
}

Используйте это в необязательной строке:

if myString.isNilOrEmpty { print("Crap, how'd this happen?") } 
person Joshua Hart    schedule 14.05.2018

Swift 3 Лучше всего проверить пустую строку

if !string.isEmpty{

// do stuff

}
person Anas    schedule 21.06.2018

Вы можете создать свою собственную пользовательскую функцию, если от этого много ожидаете.

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")
}
person vol7ron    schedule 01.04.2015

Решение Swift 3 Используйте необязательное развернутое значение и сравните его с логическим значением.

if (string?.isempty == true) {
    // Perform action
}
person Sam    schedule 10.05.2017

Использование isEmpty

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

Использование allSatisfy

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

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

Использование необязательной строки

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

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

Ссылка: https://useyourloaf.com/blog/empty-strings-in-swift/

person raaz    schedule 22.05.2019

Это общее решение для всех типов, которые соответствуют протоколу Collection, который включает String:

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

Создайте расширение класса 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

Обратите внимание, что это вернет ИСТИНА, если строка содержит один или несколько пробелов. Чтобы рассматривать пустую строку как «пустую», используйте ...

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

... вместо. Для этого требуется Foundation.

Используйте это так ...

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

Swift 3 Это хорошо работает, чтобы проверить, действительно ли строка пуста. Потому что isEmpty возвращает true, когда есть пробел.

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

Примеры:

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

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

let myString = " "
myString.isEmptyAndContainsNoWhitespace() // returns false
person FredFlinstone    schedule 15.09.2017

Вы должны сделать что-то вроде этого:
if !(string?.isEmpty ?? true) { //Not nil nor empty }

Оператор объединения Nil проверяет, не является ли параметр nil, если он не равен nil, затем проверяет его свойство, в данном случае isEmpty. Поскольку этот необязательный параметр может иметь значение nil, вы указываете значение по умолчанию, которое будет использоваться, когда значение параметра optional равно нулю.

person Dominik Babić    schedule 10.09.2018

На основе этот пост на Medium, с небольшой настройкой для Swift 5, я получил этот код, который работал.

if let stringA, !stringA.isEmpty {
    ...blah blah
}

Хотя я понимаю преимущества создания расширения, я подумал, что это может помочь кому-то, кому нужен только небольшой компонент / пакет.

person Alexandre    schedule 15.07.2021

Когда я имел дело с передачей значений из локальной базы данных на сервер и наоборот, у меня было слишком много проблем с? И! И с чем нет.

Итак, я создал утилиту Swift3.0 для обработки нулевых случаев, и я могу почти полностью избежать? И! В коде.

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

Ex:-

До :

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

После :

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

и когда требуется проверить правильность строки,

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

Это избавило меня от необходимости добавлять и удалять многочисленные символы? И! После написания кода, который имеет разумный смысл.

person Nikhil Mathew    schedule 08.02.2017

Используйте тернарный оператор (также известный как условный оператор C++ forever!):

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

stringA! принудительное разворачивание происходит только когда stringA != nil, так что это безопасно. Многословие == false несколько более читабельно, чем еще один восклицательный знак в !(stringA!.isEmpty).

Лично я предпочитаю немного другую форму:

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

В приведенном выше утверждении сразу становится ясно, что весь блок if не выполняется, когда переменная равна nil.

person Gary    schedule 16.02.2018

полезно при получении значения из UITextField и проверке строки nil & empty

@IBOutlet weak var myTextField: UITextField!

Вот ваша функция (когда вы нажимаете button), которая получает строку из UITextField и выполняет некоторые другие вещи

@IBAction func getStringFrom_myTextField(_ sender: Any) {

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

Это позаботится о значении nil, а также о строке empty.

У меня это сработало отлично.

person Soropromo    schedule 14.05.2018

На мой взгляд, лучший способ проверить нулевую и пустую строку - это подсчитать количество строк.

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")
}
person yo2bh    schedule 30.10.2019

Swift 5.4

extension Optional where Wrapped: Collection {
  var isEmptyOrNil: Bool {
    guard let value = self else { return true }
    return value.isEmpty
  }
}

Использование:

var name: String?
name.isEmptyOrNil //true
name = "John Peter"
name.isEmptyOrNil //false
person Jeba Moses    schedule 17.05.2021

вы можете использовать эту функцию

 class func stringIsNilOrEmpty(aString: String) -> Bool { return (aString).isEmpty }
person Ahmed Khemiri    schedule 29.11.2016
comment
Не быстрый пользователь; не могли бы вы объяснить, почему это не вызывает исключения, если передается nil? - person Foon; 29.11.2016
comment
Он не генерирует исключение, потому что вы вообще не можете передать nil в эту функцию (кроме objc, и в этом случае она действительно выйдет из строя). - person Alfonso; 30.11.2016
comment
Это не отвечает на вопрос. Он не проверяет ноль, так как не принимает необязательный - person Wayne Ellery; 06.04.2017

person    schedule
comment
Элегантно, но неуклюже;), истинный вид сбивает интуицию - person TruMan1; 06.05.2016