Подтвердить что ты не робот

Проверить строку для nil & empty

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

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

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

Ответ 1

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

(string ?? "").isEmpty

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

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

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

Ответ 2

Возможно, вы можете использовать предложение 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 */
}

Ответ 3

Если вы используете 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)
}

Ответ 4

Используя оператор guard

Я использовал Swift некоторое время, прежде чем узнал о guard. Теперь я большой поклонник. Он используется аналогично if, но он позволяет раннее return и просто делает для более чистого кода в целом.

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

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)

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

См. также

Ответ 5

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

Ответ 6

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

extension Optional where Wrapped == String {

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

}

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

extension Optional where Wrapped: Collection {

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

}

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

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

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

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

Источники:

Ответ 7

Я знаю, что есть много ответов на этот вопрос, но ни один из них не кажется таким удобным, как это (на мой взгляд) для проверки данных 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
}

Ответ 8

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

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

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

enter image description here

Ответ 9

Если вы хотите получить доступ к строке как необязательный, вы должны использовать Ryan Answer, но если вы только заботитесь о непустоте строки, моя предпочтительная стенография для этого -

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

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

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

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

Ответ 10

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?") } 

Ответ 11

Swift 3 Для проверки Empty String лучше всего

if !string.isEmpty{

// do stuff

}

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

Обратите внимание, что это вернет TRUE, если строка содержит одну или несколько пробелов. Чтобы обработать пустую строку как "пустую", используйте...

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

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

Используйте его таким образом...

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

Ответ 15

Свифт 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

Ответ 16

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

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

Ответ 17

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

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

Ответ 18

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

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

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

Пример: -

До:

    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
    }

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

Ответ 19

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

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

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

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

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

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

Ответ 20

полезно при получении значения из 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 строке.

Это сработало очень хорошо для меня.

Ответ 21

Использование 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/

Ответ 22

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

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