Неявное логическое преобразование литерала объекта Objective-C всегда оценивается как истинное значение ios
Я недавно скачал Xcode 9.2 и обновил настройки своего проекта до рекомендованных. Теперь я получаю это предупреждение в своем коде для всех мест, где я использовал assert, например:
assert(@"Must be implemented by subclass");
Какова правильная альтернатива для этого?
3 ответа
Если вы используете Objective-C, вы хотите позвонить NSAssert()
не assert()
(которая является функцией C).
NSAssert(NO, @"Must be implemented by subclass");
Если вы хотите продолжить использовать assert()
, вы должны рассматривать это как функцию C.
assert(0); // <-- Note: no message is provided
Вы можете сойти с рук
assert(/* Must be implemented by subclass */ 0);
или же
assert("Must be implemented by subclass" == NULL); // <-- Note: No `@`
Ваш assert
условие - это строка, которая всегда будет проходить тест.
Вы должны проверить состояние в assert
А) утверждение требует условия для проверки. Вы рассматриваете строку как условие, и она не равна нулю...
б) вы используете NSString, а не char*, поэтому вы передаете объект objC в C, который в этом случае тоже не будет работать...
assert(codition & "Message");
в) вы должны использовать NSAssert для кода ObjC.. сделать
NSAssert(codition, @"Message");