-1

我有一个 MPMoviePlayerController 实例。我希望检查它的playbackState 属性以获取多个值之一。因此,我做这样的事情:

if (moviePlayer.playbackState == (MPMoviePlaybackStateStopped ||
                                  MPMoviePlaybackStatePlaying ||
                                  MPMoviePlaybackStatePaused)) {
    // ...
    // Perform some logic
    // ...
}

这按预期工作,但会导致编译器警告:

使用逻辑“||” 与常数操作数。

编译器的解决方法是改用按位运算|符。在 Stack Overflow 上搜索,你会发现几个答案暗示了同样的事情。但是使用按位 OR 真的不是我在这里需要的。

MPMoviePlaybackState在 MPMoviePlayerController.h 中声明:

enum {
    MPMoviePlaybackStateStopped,
    MPMoviePlaybackStatePlaying,
    MPMoviePlaybackStatePaused,
    MPMoviePlaybackStateInterrupted,
    MPMoviePlaybackStateSeekingForward,
    MPMoviePlaybackStateSeekingBackward
};
typedef NSInteger MPMoviePlaybackState;

这不是位掩码(而且它也没有多大意义——枚举值是互斥模式,而不是要组合的标志)。我真的很想使用逻辑||.

(在我的特殊情况下,基础值为 0,1,2,按位示例可能有效,但这只是巧合。)

我应该如何改写以避免警告或我#pragma clang diagnostic ignored ...可以用什么来消除警告?

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

提前致谢!

4

3 回答 3

2

显然,(enumval1 || enumval2 || ..)是错误的。您不能||像这样使用运算符,而只能使用逻辑表达式。
运算符有效,因为它是一个简单的|按位 OR,它只为您工作,并且仅当您的枚举成员是 2 的不同幂(例如 1、2、4、8,...)时。

它与二进制数字的按位表示有关,如果数字是 2 的幂,则如下所示:2->10、4->100、8->1000 等。因此,它2 | 8会像0010 | 1000 = 1010不为零,if语句将继续。

编译器警告是完全正确的并且在这一点上有所帮助。使用switch(..)orif(..) else if(..)语句,或使您的枚举如下所示:

enum yourEnum
{
  enumval1 = 1 << 0;
  enumval2 = 1 << 1;
  enumval3 = 1 << 2;
  // ...
}
于 2012-10-04T14:30:31.480 回答
0

你为什么不这样做呢?

if ((moviePlayer.playbackState == MPMoviePlaybackStateStopped) ||
    (moviePlayer.playbackState == MPMoviePlaybackStatePlaying) ||
    (moviePlayer.playbackState == MPMoviePlaybackStatePaused)) {
    // ...
    // Perform some logic
    // ...
}
于 2012-10-04T14:26:57.827 回答
-2

我建议使用带有跌落逻辑的 switch/case 块,如下所示:

switch(moviePlayer.playbackState){
    case MPMoviePlaybackStateStopped: /* falls through */
    case MPMoviePlaybackStatePlaying: /* falls through */
    case MPMoviePlaybackStatePaused:  /* falls through */
        // your stuff
}

这将导致使用尽可能少的代码实现预期的行为。枚举是为确切的开关案例类型的业务而制作的。并且它们比“if”语句更优化了性能,因为 CPU 在到达代码时甚至不必测试这些值。编译器在该位置计算正确的 ASM 跳转偏移量。所以它和闪电一样快:)

于 2012-10-04T14:30:32.990 回答