Утвърждаване с аргумент от низ не работи според очакванията

РЕДАКТИРАНЕ: Проблемът беше с твърдението, както хората посочиха по-долу. Благодаря за помощта!

Имам набор от 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. Условното условие не се оценява като true, въпреки че стойността очевидно е 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 спира изпълнението само ако изразът, който му предавате, е false. Тъй като низовият литерал винаги е различен от нула, той никога няма да спре изпълнението.

Сега, тъй като използвате 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