-1

MPMoviePlayerController インスタンスがあります。多くの値のいずれかについて、そのplaybackStateプロパティを確認したいと思います。そのため、私は次のようなことをします:

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

これは期待どおりに機能しますが、コンパイラの警告が発生します。

論理 '||' の使用 定数オペランドで。

コンパイラの修正は、|代わりにビット演算子を使用することです。Stack Overflow で検索すると、同じことを示唆する回答がいくつか見つかります。しかし、ビットごとの OR を使用することは、ここで必要なものではありません。

MPMoviePlaybackStateMPMoviePlayerController.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 | 8これは、2 の累乗の数値の場合、2 の累乗の数値のビット単位の表現と関連しています。2->10、4->100、8->1000 などです0010 | 1000 = 1010。ゼロではなく、ifステートメントが続行されます。

コンパイラの警告は完全に正しく、現時点では役に立ちます。switch(..)orステートメントを使用するかif(..) 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
}

これにより、可能な限り少ないコードで意図した動作が得られます。列挙型は、正確なスイッチケースの種類のビジネスのために作られています。また、CPU はコードに到達するときに値をテストする必要さえないため、「if」ステートメントよりもパフォーマンスが最適化されます。コンパイラは、その位置で正しい ASM ジャンプ オフセットを計算します。だから、稲妻と同じくらい速い:)

于 2012-10-04T14:30:32.990 に答える