Программирование

Как проверить NSString на пустоту или nil в Objective‑C

Используйте свойство length, чтобы проверить NSString на nil или пустую строку. Обрежьте пробелы для пустых строк и обрабатывайте NSNull или нестроковые объекты.

Как проверить, пустой ли NSString в Objective‑C?

Самый быстрый и надёжный способ проверить, пустой ли NSString (или даже nil), — это обратиться к его свойству length.
Поскольку в Objective‑C отправка сообщения nil просто возвращает ноль, проверка [myString length] == 0 охватывает оба случая. Если предварительно обрезать пробелы, то даже строка, состоящая только из пробелов, будет распознана как пустая.


Содержание


Почему length работает для nil и пустых строк

В Objective‑C сообщение, отправленное nil, никогда не приводит к сбою; оно просто возвращает нулевое значение нужного типа. Поэтому вызов length у nil даёт 0. То же самое происходит и с уже созданной строкой, но без символов (@""). Это поведение зафиксировано в документации Foundation и широко используется в продакшн‑коде.

Как указано в документации Apple Foundation, вызов методов на nil возвращает ноль для числовых типов.


Базовая проверка через length

objc
NSString *text = /* ваша строка */;
if ([text length] == 0) {
    // Строка либо nil, либо пустая.
    NSLog(@"String is empty or nil");
} else {
    NSLog(@"String has content: %@", text);
}
  • Почему это работает:
    • Если text равен nil, [text length] равно 0 — именно так обрабатываются сообщения nil.
    • Если text равно @"", его длина тоже 0 — это и есть определение пустой строки.
    • Любая непустая строка возвращает положительное число.

Как отмечено в ответе на Stack Overflow, [aString length] == 0 полностью покрывает проверку nil и пустых строк.


Обрезка пробелов перед проверкой

Если нужно считать строку, содержащую только пробелы, табы или переводы строк, пустой, сначала обрежьте её:

objc
NSString *trimmed = [text stringByTrimmingCharactersInSet:
                     [NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([trimmed length] == 0) {
    NSLog(@"String is empty, nil, or whitespace only");
}

Такой подход часто используется при валидации форм и поддерживается многими разработчиками, включая пример из блога Repeato.

На самом деле, это стандартное решение для многих проектов.


Обработка NSNull и других объектов

Иногда данные приходят из JSON или Core Data, где вместо nil используется объект‑заглушка NSNull. Чтобы учесть это, можно расширить проверку:

objc
BOOL isStringEmpty(id obj) {
    if (obj == nil || obj == [NSNull null]) return YES;
    if (![obj isKindOfClass:[NSString class]]) return NO;
    return [[obj stringByTrimmingCharactersInSet:
             [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0;
}

Этот вспомогательный метод, вдохновлённый inline‑функцией из обсуждения на Stack Overflow, безопасно обрабатывает nil, NSNull и объекты, не являющиеся строками.

На самом деле, это надёжный шаблон.


Пользовательские утилиты или категории

Если хочется более читаемого синтаксиса, создайте категорию для NSString:

objc
@interface NSString (EmptyCheck)
- (BOOL)isBlank;   // nil или только пробелы
- (BOOL)isEmpty;   // nil или ровно @"" (без обрезки)
@end

@implementation NSString (EmptyCheck)
- (BOOL)isBlank {
    if (self == nil || self == (NSString*)[NSNull null]) return YES;
    return [[self stringByTrimmingCharactersInSet:
             [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0;
}
- (BOOL)isEmpty {
    return (self == nil || [self length] == 0);
}
@end

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

objc
if ([myString isBlank]) { /* обработать пустую или пробельную строку */ }

Такие паттерны широко применяются в проектах iOS и поддерживаются многими опытными разработчиками.

На самом деле, они встречаются в большинстве кодовых баз, которые я видел.


Итоги

  • Самый простой и надёжный тест — [myString length] == 0, который охватывает и nil, и пустые строки.
  • Для строк, состоящих только из пробелов, сначала обрезайте и затем проверяйте длину.
  • Если нужно поддерживать NSNull или объекты, не являющиеся строками, оберните логику в вспомогательную функцию или категорию, как показано выше.
Авторы
Проверено модерацией
Модерация
Как проверить NSString на пустоту или nil в Objective‑C