在Objective-C的这个小型演示中:
第一个枚举:
typedef NS_ENUM(NSUInteger, Day) {
DaySunday,
DayMonday,
DayTuesday
};
第二个枚举:
typedef NS_ENUM(NSUInteger, Month) {
MonthJanuary,
MonthFebruary,
MonthMarch,
MonthApril
};
比较时:
Day sunday = DaySunday;
Month january = MonthJanuary;
if (sunday == january) {
NSLog(@"case1 with warning");
}
if (DaySunday == january) {
NSLog(@"case2 without warning");
}
那么在case2中如何获得警告?
答案 0 :(得分:0)
(Objective-)C中的枚举类型是非常弱的类型。根据C标准,每个枚举常量(您的january
等)都有一个整数类型,不是。此外,在需要时会将枚举类型的值隐式转换为整数类型。
Clang会警告您,并且它只是一个 warning ,因为C Standard在整数之间进行比较是正确的值。
在您的DaySunday == january
中,左操作数为整数类型,右操作数隐式转换为整数类型,因此这完全是合法且正确的标准C。Clang可以选择发出警告,为什么不这样做可能取决于Clang内部的设计决定或设计结果。
要感谢Clang经常在标准C不需要警告的地方发出警告,但是您不能依靠它显示C中的所有陷阱。
要解决您的问题,可以根据需要将字面量转换为枚举类型(Day)DaySunday == january
,但可以合理地确定这会使C看起来更糟;-)
答案 1 :(得分:-1)
我不确定为什么会发生这种行为,但这很奇怪很酷。要获得警告,必须将_filterItems(items) {
return items.filter(async item => {
let isTrue = await AsyncStorage.getItem('key');
return isTrue;
})
}
强制转换为类型DaySunday
。
Day
将if ((Day)DaySunday == january) {
NSLog(@"case2 without warning");
}
显式转换为january
不会触发警告,因此静态分析器似乎正确地将Month
视为january
类型(因为您声明了这样),但会隐式转换Month
以便进行比较。
说句公道话,第一种情况下的警告实际上并不是理想的行为,因为DaySunday
和Day
都是NSUIntegers,因此具有可比性。正如您在运行此代码时所观察到的,两个比较都是正确的,这意味着警告实际上没有意义。
答案 2 :(得分:-2)
您必须将enum更改为int才能删除警告
if ((int)sunday == (int)january) {
NSLog(@"case1 with warning");
}