【问题标题】:Warn against BOOL to ENUM conversion in XCode警告 XCode 中的 BOOL 到 ENUM 转换
【发布时间】:2017-10-18 14:00:20
【问题描述】:

以前我有一个方法可以完成一些接受 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 中的警告列表,但没有任何东西允许编译器显示此警告。

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

【问题讨论】:

  • 在 Objective-C 中 NO 被定义为 0 而 YES 被定义为 1,所以它是完全合法的。
  • Hmm 在 XCode 9.0.1 中我无法重现此错误Cannot initialize a parameter of type 'Status' with an rvalue of type 'BOOL' (aka 'bool')
  • @schmidt9,我刚刚更新到 9.0.1,但没有收到此警告。我想知道您的项目设置中是否启用了触发此错误的警告?
  • 我没有更改任何默认警告设置,但接受了 Xcode 升级项目设置的建议,因此它可能是一个标志,请查看项目设置

标签: ios objective-c xcode enums xcode9


【解决方案1】:

在(Objective-)C 中,_Bool、char、int、long et al 类型及其无符号对应物都是 整数类型 . enum 定义的类型本身不是不同的类型,而是其底层整数类型的常量的集合。

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

由于整数提升和整数转换,不同整数类型之间的许多赋值是自动且无声的。甚至浮点类型也可能涉及,例如:

bool b = true;
float f = b;

是完全合法的,编译器很可能不加注释,甚至作为警告。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 2022-10-16
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多