我有一个MPMoviePlayerController实例。我希望检查其playbackState属性的多个值之一。因此我做了这样的事情:
if (moviePlayer.playbackState == (MPMoviePlaybackStateStopped ||
MPMoviePlaybackStatePlaying ||
MPMoviePlaybackStatePaused)) {
// ...
// Perform some logic
// ...
}
这可以按预期工作但会导致编译器警告:
使用逻辑'||'用常数操作数。
编译器的修复方法是使用按位|
运算符。在Stack Overflow上搜索,你会发现couple answers表示同样的事情。 但是使用按位OR确实不是我需要的。
MPMoviePlaybackState
在MPMoviePlayerController.h中声明:
enum {
MPMoviePlaybackStateStopped,
MPMoviePlaybackStatePlaying,
MPMoviePlaybackStatePaused,
MPMoviePlaybackStateInterrupted,
MPMoviePlaybackStateSeekingForward,
MPMoviePlaybackStateSeekingBackward
};
typedef NSInteger MPMoviePlaybackState;
这不是一个位掩码(并且它也不是很有意义 - 枚举值是互斥模式,而不是要组合的标志)。我确实想要使用逻辑||
。
(在我的特定情况下,基础值为0,1,2,按位示例可能有效,但这只是巧合。)
我应该如何改写以避免警告或#pragma clang diagnostic ignored ...
我可以使用什么来消除警告?
(指向所有此类诊断列表的奖励点 - 我似乎无法在手册中找到一个。)
提前致谢!
答案 0 :(得分:2)
显然,(enumval1 || enumval2 || ..)
是错误的。您不能像这样使用||
运算符,只能使用逻辑表达式
|
运算符是有效的,因为它是一个简单的按位OR,它只对你有用,并且只有你的枚举成员的幂不同为2(例如1,2,4,8,...)。
它与二进制中的数字的按位表示相关联,如果2的幂的数字是这样的:2-> 10,4-> 100,8-> 1000等等。所以,对于2 | 8
它将像0010 | 1000 = 1010
,它不是零,if
语句将继续。
编译器警告完全正确并且在此时有所帮助。使用switch(..)
或if(..) else if(..)
语句,或者像这样制作枚举:
enum yourEnum
{
enumval1 = 1 << 0;
enumval2 = 1 << 1;
enumval3 = 1 << 2;
// ...
}
答案 1 :(得分:0)
你为什么不这样做?
if ((moviePlayer.playbackState == MPMoviePlaybackStateStopped) ||
(moviePlayer.playbackState == MPMoviePlaybackStatePlaying) ||
(moviePlayer.playbackState == MPMoviePlaybackStatePaused)) {
// ...
// Perform some logic
// ...
}
答案 2 :(得分:-2)
我建议使用带有跌落槽逻辑的开关/案例块:
switch(moviePlayer.playbackState){
case MPMoviePlaybackStateStopped: /* falls through */
case MPMoviePlaybackStatePlaying: /* falls through */
case MPMoviePlaybackStatePaused: /* falls through */
// your stuff
}
这将导致预期的行为尽可能少的代码。枚举是为了切换案件的业务而精心制作的。并且它们比“if”语句更优化性能,因为CPU甚至不必在到达代码时测试值。编译器在该位置计算正确的ASM跳转偏移量。所以它和lighning一样快:)