Проверить пустую строку в Swift?

166

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

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

Как обнаружить пустые строки в Swift?

chrisjlee
источник
3
Ваш объективный код неверен. Это плохо для нулевых строк. В цели C фактически используется: if (myString.length) {'это строка с длиной}. Это работает на ноль строк. Это просто и легко читается.
Том Андерсен

Ответы:

241

Теперь есть встроенная возможность обнаружения пустой строки с помощью .isEmpty:

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

Предварительная документация Apple: «Строки и символы» .

chrisjlee
источник
1
Вы также можете использовать isEqualToString, что удобно, если вы инициализируете переменную с помощью NSString ('var emptyString: NSString'): emptyString.isEqualToString ("")
Sven
1
это условие не выполняется, когда пользователь вводит пробелы.
Шану Сингх
Обновление: вот isEmpty: developer.apple.com/documentation/swift/string/2946268-isempty
chrisjlee
109

Краткий способ проверить, является ли строка нулевой или пустой:

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инструкции вы можете смело использовать вашу развернутую непустую строку.

Suragch
источник
40

В Xcode 11.3 swift 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")
}
Saranjith
источник
2
Есть ли разница между вашим ответом и исключением?
Ахмад Ф
Это не работает, если пользователь просто вводит кучу пробелов.
Supertecnoboff
2
В типографии пробелы считаются символом, поэтому он не пустой. Если вы хотите, то измените условие на 'lang.trimmingCharacters (in: .whitespaces) .isEmpty'
Saranjith
28

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

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

Как пользоваться:

MyString.blank(" ") // true
Евгений
источник
7
И как продолжение ... gist.github.com/danielgomezrico/f852114508c1cfaaa849
Даниэль Гомес Рико
2
В качестве дополнения вы можете рассмотреть возможность использования whitespaceAndNewlineCharacterSet вместо просто пробелов.
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бы он был просто необязательным, он бы работал, но вы не можете обойти родительский объект, являющийся необязательным, как этот (потому что если prioritynil, то у него даже нет descriptionсвойства для проверки на пустоту в первую очередь).
Джон Монтгомери
9

Чтобы сделать нулевую проверку и длину одновременно Swift 2.0 и iOS 9, вы можете использовать

if(yourString?.characters.count > 0){}
MadNik
источник
4

isEmpty сделает так, как вы думаете, если string == "", он вернет true. Некоторые из других ответов указывают на ситуацию, когда у вас есть необязательная строка.

ПОЖАЛУЙСТА, используйте дополнительные цепи !!!!

Если строка не равна nil, будет использоваться isEmpty, иначе - нет.

Ниже optionString НЕ будет установлен, потому что строка имеет значение nil

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
}
UnRewa
источник
1

Для необязательных строк, как насчет:

if let string = string where !string.isEmpty
{
    print(string)
}
PiXeL16
источник
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 {}

Это легко пропустить ! знак в начале первой линии.

moonvader
источник
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)
rgreso
источник