Я использовал это в своем приложении для iPhone
if (title == nil) {
// do something
}
но он выдает какое-то исключение, и консоль показывает, что заголовок "(null)".
Итак, я использую это сейчас:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
В чем разница, и как лучше определить, является ли строка нулевой?
ios
objective-c
cocoa-touch
Тео Чунг Пинг
источник
источник
Ответы:
Как уже отмечали другие, в Какао / Objective C. есть много видов «нулей». Но еще одна вещь, на которую следует обратить внимание, - это то, что [title isKindOfClass: [NSNull class]] бессмысленно сложен, поскольку [NSNull null] задокументировано как синглтон, так что вы можете просто проверить на равенство указателей. См. Темы для Какао: Использование Нуль .
Таким образом, хороший тест может быть:
Обратите внимание, как вы можете использовать тот факт, что даже если title равен nil, title.length вернет 0 / nil / false, то есть 0 в этом случае, так что вам не нужно его использовать в особых случаях. Это то, к чему люди, плохо знакомые с Objective C, испытывают трудности с привыканием, особенно из других языков, где сообщения / методы вызывают ноль сбой.
источник
Map
значение элемента - чтоnull
в Dart - не соответствуетnil
илиNULL
в Objective C. Причина в том , что это на самом делеNUNull null
, а неNULL
нулевой. Спасибо @PeterNLewis!это так же просто, как
помните, что в цели C, если объект равен нулю, он возвращает 0 в качестве значения.
Это даст вам как нулевую строку, так и строку 0 длины.
источник
object = @"";
илиobject = nil;
)Обратитесь к следующим связанным статьям на этом сайте:
Я думаю, что ваша ошибка связана с чем-то другим, так как вам не нужно делать дополнительную проверку.
Также см. Этот связанный вопрос: Правильная проверка nil sqlite текстового столбца
источник
Я обнаружил, что для того, чтобы действительно сделать это правильно, вам в конечном итоге придется сделать что-то похожее на
Иначе вы получите странные ситуации, когда контроль все равно будет обходить ваш чек. Я не сталкивался с одним, который проходит через
isEqual
проверки и длины.источник
Что со всеми этими "работает на меня ответы"? Мы все пишем на одном языке, и правила
Это то, что будет работать для всех. Если данное решение только «работает для вас», это только потому, что поток вашего приложения не допускает сценарий, в котором ссылка может быть нулевой или длина строки равна 0. Правильный способ сделать это - метод, который будет обрабатывать что вы хотите во всех случаях.
источник
nil
(примечание: не «ноль»), то при отправке сообщения, напримерlength
, будет получено 0 (или соответствующее значение 0 для типа возврата метода). Это правило языка. Там нет необходимости проверятьnil
отдельно в этом случае.Если вы хотите проверить все ноль / пустые объекты (например, пустые строки или пустые массивы / наборы), вы можете использовать следующее:
источник
Есть две ситуации:
Возможно, что объект есть
[NSNull null]
, или это невозможно.Ваше приложение обычно не должно использовать
[NSNull null];
вас, используйте его, только если вы хотите поместить « нулевой » объект в массив или использовать его в качестве значения словаря. И тогда вы должны знать, какие массивы или словари могут содержать нулевые значения, а какие нет.Если вы считаете, что массив никогда не содержит
[NSNull null]
значений, не проверяйте его. Если есть[NSNull null]
, вы можете получить исключение, но это нормально: исключения Objective-C указывают на ошибки программирования. И у вас есть программная ошибка, которую нужно исправить, изменив некоторый код.Если объект может быть
[NSNull null]
, то вы проверяете это довольно просто путем тестирования(object == [NSNull null])
. ВызовisEqual
или проверка класса объекта - нонсенс. Есть только один[NSNull null]
объект, и простой старый оператор C проверяет его в порядке, самым простым и эффективным способом.Если вы проверяете
NSString
объект, который не может быть[NSNull null]
(потому что вы знаете, что он не может быть[NSNull null]
или потому что вы только что проверили, что он отличается от этого[NSNull null]
, то вам нужно спросить себя, как вы хотите обрабатывать пустую строку, то есть ту, которая имеет длину 0. Если вы обрабатывать это какnull
строкуnil
, затем test(object.length == 0)
. object.length вернет 0 еслиobject == nil
, так что этот тест охватывает ноль объектов и строк длиной 0. Если вы обрабатываете строку длиной 0, отличную от нулевой строки, просто проверьте, еслиobject == nil
.Наконец, если вы хотите добавить строку в массив или словарь, и строка может быть nil, у вас есть выбор не добавлять ее, заменять ее
@""
или заменять ее[NSNull null]
. Замена его@""
означает, что вы теряете способность различать «без строки» и «строка длины 0». Замена его[NSNull null]
означает, что вы должны писать код при доступе к массиву или словарю, который проверяет[NSNull null]
объекты.источник
Вы просто проверьте на ноль
или
источник
Решение MACRO (2020)
Вот макрос, который я использую для безопасной строки вместо получения строки « (null) » в UILabel например:
Допустим, у вас есть класс-член и свойство name, а имя равно nil:
с макросом:
красиво и чисто 😊
Решение для расширения (2020)
Если вы предпочитаете проверять nil Null и пустую строку в вашем проекте, вы можете использовать мою дополнительную строку ниже:
NSString + Extension.h
NSString + Extension.m
Пример использования
источник
источник
Попробуйте это для проверки ноль
источник
Это будет работать в следующих случаях
NSString *strOne = @""
ИЛИNSString *strOne = @"StackOverflow"
ИЛИNSString *strOne = [NSNull null]
ИЛИNSString *strOne
.источник
Если такого рода вещи еще не существуют, вы можете создать категорию NSString:
источник
Что работает для меня это
if ( !myobject )
источник
NSArray *testarray = [NSArray arrayWithObjects:[NSNull null],@"", nil]; NSString *string = [testarray objectAtIndex:0]; NSLog(@"null string value: %@",string); if (!string) { NSLog(@"string evaluates to null"); } if (string && (string==(id)[NSNull null])) { NSLog(@"string does not evaluate to null"); }
Полная проверка строки на нулевые условия может быть следующей: <\ br>
источник
Я проверяю только нулевую строку с
источник
источник
источник
Для строки:
}
Смотрите картинку ниже:
источник
Для строки:
источник