使用逻辑||使用枚举值

时间:2012-10-04 14:24:15

标签: objective-c mpmovieplayercontroller clang

我有一个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 ...我可以使用什么来消除警告?

(指向所有此类诊断列表的奖励点 - 我似乎无法在手册中找到一个。)

提前致谢!

3 个答案:

答案 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一样快:)