在XCode中警告BOOL到ENUM转换

时间:2017-10-18 14:00:21

标签: ios objective-c xcode enums xcode9

以前我有一个方法可以执行一些接收BOOL的任务。

-(void)processUserBasedonStatus:(BOOL)newUser

然后我定义了一个NS_ENUM来接受更多像这样的状态

typedef NS_ENUM(NSInteger, Status)
{
    StatusNewUser=0,
    StatusCurrentUser,
    StatusOldUser,
    StatusOther
};

并更新了使用新ENUM参数的方法

-(void)processUserBasedonStatus:(Status)userStatus

一切都运作良好,除了Xcode没有抱怨我忘记更新调用方法的地方,即

[self processUserBasedonStatus:YES];
[self processUserBasedonStatus:NO];

在这种情况下,YES& NO将仅映射到ENUM的前2个值。我在Xcode中尝试了警告列表但没有任何东西允许编译器提出这个警告。

有没有办法让编译器警告我们这种行为?

1 个答案:

答案 0 :(得分:0)

在(目标 - )C中,类型_Boolcharintlong 及其未签名对应的所有< em>整数类型。 enum定义的类型不是本身的不同类型,而是其基础整数类型的常量集合。

Objective-C类型BOOLtypedef的同义词(#define_Bool)或char类型之一,具体取决于编译器的版本。

由于整数提升整数转换,不同整数类型之间的许多分配都是自动且无声的。甚至可以涉及浮点类型,例如:

bool b = true;
float f = b;

完全合法,即使作为警告,也可能被编译器取消注释。

鉴于所有这些问题的答案:

  

有没有办法让编译器警告我们这种行为?

目前似乎“不” - 代码在(目标 - )C中是完全合法的。但是它可疑并且可能表示错误,并且没有什么能阻止编译器发出警告,就像它对其他一些合法但可疑的构造一样。您可以通过bugreport.apple.com向Apple提交报告(您需要Apple ID才能执行此操作),建议他们添加此类警告。