Как проверить NSString на пустоту или nil в Objective‑C
Используйте свойство length, чтобы проверить NSString на nil или пустую строку. Обрежьте пробелы для пустых строк и обрабатывайте NSNull или нестроковые объекты.
Как проверить, пустой ли NSString в Objective‑C?
Самый быстрый и надёжный способ проверить, пустой ли NSString (или даже nil), — это обратиться к его свойству length.
Поскольку в Objective‑C отправка сообщения nil просто возвращает ноль, проверка [myString length] == 0 охватывает оба случая. Если предварительно обрезать пробелы, то даже строка, состоящая только из пробелов, будет распознана как пустая.
Содержание
- Почему
lengthработает дляnilи пустых строк - Базовая проверка через
length - Обрезка пробелов перед проверкой
- Обработка
NSNullи других объектов - Пользовательские утилиты или категории
Почему length работает для nil и пустых строк
В Objective‑C сообщение, отправленное nil, никогда не приводит к сбою; оно просто возвращает нулевое значение нужного типа. Поэтому вызов length у nil даёт 0. То же самое происходит и с уже созданной строкой, но без символов (@""). Это поведение зафиксировано в документации Foundation и широко используется в продакшн‑коде.
Как указано в документации Apple Foundation, вызов методов на
nilвозвращает ноль для числовых типов.
Базовая проверка через length
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и пустых строк.
Обрезка пробелов перед проверкой
Если нужно считать строку, содержащую только пробелы, табы или переводы строк, пустой, сначала обрежьте её:
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. Чтобы учесть это, можно расширить проверку:
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:
@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
Использование:
if ([myString isBlank]) { /* обработать пустую или пробельную строку */ }
Такие паттерны широко применяются в проектах iOS и поддерживаются многими опытными разработчиками.
На самом деле, они встречаются в большинстве кодовых баз, которые я видел.
Итоги
- Самый простой и надёжный тест —
[myString length] == 0, который охватывает иnil, и пустые строки. - Для строк, состоящих только из пробелов, сначала обрезайте и затем проверяйте длину.
- Если нужно поддерживать
NSNullили объекты, не являющиеся строками, оберните логику в вспомогательную функцию или категорию, как показано выше.