Утверждение со строковым аргументом не работает должным образом

РЕДАКТИРОВАТЬ: проблема была с утверждением, как люди указали ниже. Спасибо за помощь!

У меня есть набор enum, который я пытаюсь приравнять, но по какой-то причине он не работает. Он объявлен так:

typedef NS_ENUM(NSUInteger, ExUnitTypes) {
    kuNilWorkUnit,
    kuDistanceInMeters,
    //end
    kuUndefined
};

И я использую его здесь:

  +(NSString*) ExUnitDescription: (ExUnitTypes) exUnit
{
    if (exUnit == kuNilWorkUnit)
    {
        assert("error with units");
    }
///.... more stuff
}

Xcode не запускает мое утверждение. РЕДАКТИРОВАТЬ: утверждение предназначено только для тестирования. Я также использовал NSLog. Условие не оценивается как истинное, хотя значение явно равно kuNilWorkUnit.

xcode enum asser image

У кого-нибудь есть предложения или идеи о том, что я делаю неправильно?


person Shravan Sunder    schedule 05.12.2013    source источник
comment
По какой причине вы используете assert вместо NSAssert?   -  person Lance    schedule 06.12.2013
comment
Это не Xcode, который запускает утверждение. Это условие оценивается как false или 0 и макрос assert(). В любом случае строковый литерал никогда не превратится в указатель NULL, поэтому утверждение assert("arbitrary string literal here"); никогда не сработает. Теперь вам нужно будет прочитать документацию assert(), чтобы понять, что не так и как это решить. Дополнительные рекомендуемые материалы для чтения (внимательно): man 3 abort, man 3 exit и хороший учебник по оператору if в C.   -  person    schedule 06.12.2013
comment
Я просто использую assert, чтобы проверить эту проблему. я могу переключиться на nsassert или NSLog или что-то еще. Условие не оценивается как истинное, хотя моя переменная явно kuNilWorkUnit.   -  person Shravan Sunder    schedule 06.12.2013
comment
@ShravanSunder Условие действительно оценивается как истинное. Это просто "error with units", которое не оценивается как false.   -  person    schedule 06.12.2013
comment
Да, ребята, вы правы. Я не должен использовать assert(). Благодарность!   -  person Shravan Sunder    schedule 06.12.2013


Ответы (1)


Вы хотите сделать это:

+(NSString*) ExUnitDescription: (ExUnitTypes) exUnit
{
    assert(exUnit != kuNilWorkUnit);

    ///.... more stuff
}

Это связано с тем, что assert останавливает выполнение только в том случае, если выражение, которое вы ему передаете, ложно. Поскольку строковый литерал всегда отличен от нуля, он никогда не остановит выполнение.

Теперь, поскольку вы используете Objective C и похоже, что вы хотите, чтобы сообщение было связано с вашим утверждением, NSAssert был бы предпочтительнее.

+(NSString*) ExUnitDescription: (ExUnitTypes) exUnit
{
    NSAssert(exUnit != kuNilWorkUnit, @"error with units");

    ///.... more stuff
}
person Lance    schedule 05.12.2013
comment
было бы неплохо продвигать NSAssert вместо assert в коде Cocoa. - person Brad Allred; 06.12.2013