NSParameterAssert和BOOL

时间:2011-08-31 13:23:03

标签: objective-c

我有一个接受BOOL参数的方法,我想确保它在调用中不是nil。

-(void)setNetworkFilterWithName:(NSString *)nameOfFilter toState:(BOOL)newState 

我不能使用NSParameterAssert(newState);因为它会在BOOL为假时断言。

所以我这样做:

NSParameterAssert((newState == true) || (newState == false));

有更优雅的方法来检查吗?

2 个答案:

答案 0 :(得分:3)

BOOL是值类型,而不是指针,因此它不能是NULL。它只是假,零或非假,非零。无需检查。

修改 如果您想检查并确保BOOL YESNO可能有用,尤其是在NSNumber意外通过的情况下,这将永远评估如果它不是零,则为真。

NSParameterAssert(!newState || newState == YES);

答案 1 :(得分:2)

BOOL只是一个整数;它没有“无效”或“未设置”的概念,即物体的方式为零。 0是假的,其他任何事都是真的。你写的参数断言不可能抛出一个断言:((newState == YES)||(newState == NO))总是为真。你不能用BOOL做你想做的事。您可以转换为使用NSNumber,作为对象类型,允许您传入nil并检查它。

编辑:我对表达式的评估不正确((newState == YES)||(newState == NO));如果你超出了YES和NO提供的范围(也就是说,newState不是0或1),那么它将在C意义上评估为“true”或“false”,它将不< / em>等于YES或NO。 (newState ||!newState)在C中始终为true,但是((newState == YES)||(newState == NO))只有在确定newState保持值YES或NO且没有其他值时才会始终为true。感谢Joe指出错误。