在XCode中对BOOL进行ENUM转换的警告
问题描述:
以前我有一个方法可以完成一些需要BOOL的任务。在XCode中对BOOL进行ENUM转换的警告
-(void)processUserBasedonStatus:(BOOL)newUser
然后我定义的NS_ENUM接受更多的国家这样
typedef NS_ENUM(NSInteger, Status)
{
StatusNewUser=0,
StatusCurrentUser,
StatusOldUser,
StatusOther
};
和更新的方法来使用新的ENUM PARAM
-(void)processUserBasedonStatus:(Status)userStatus
一切运作良好,除了Xcode中没不会抱怨忘记更新通话方式的地方,例如
[self processUserBasedonStatus:YES];
[self processUserBasedonStatus:NO];
在这种情况下,YES & NO只会映射到ENUM的前2个值。我尝试了Xcode中的警告列表,但没有任何东西允许编译器提出这个警告。
有没有办法让编译器警告我们这种类型的行为?
答
在(Objective-)C类型_Bool
,char
,int
,long
等和及其无符号对应都是整数类型。由enum
定义的类型不是不同的类型本身而是它们基础整数类型的常量的集合。
Objective-C的类型BOOL
要么是用于_Bool
同义词(typedef
或#define
),或者,所述char
类型之一取决于编译器的版本。
由于整数促销和整数转换不同整数类型之间的许多分配是自动和无声的。即使浮点类型可以参与,例如:
bool b = true;
float f = b;
是完全合法的,并很可能去注释掉由编译器甚至警告。
考虑到所有这些回答你的问题:
有没有一种方法,使编译器警告我们这种类型的行为?
目前看起来“不” - 代码在(Objective-)C中是完全合法的。然而,可疑并且可能表示错误,并且没有任何事情停止编译器发出警告,因为它对于其他合法但可疑的构造。您可以在bugreport.apple.com上向Apple提交报告(您需要Apple ID才能执行此操作),建议他们添加此警告。
Objective-C中'NO'被定义为'0',YES被定义为'1',所以它是完全合法的。 – vadian
嗯XCode 9.0.1我不能重现这个获取错误'不能初始化类型为'BOOL'(又名'布尔')'' – schmidt9
@ schmidt9,我刚刚更新到9.0.1和右值类型'状态'的参数和我没有得到这个警告。我想知道在您的项目设置中是否启用了触发此错误的警告? – ArdenDev