web-dev-qa-db-ja.com

XOR Objective-c

2つのコンポーネントのいずれかがtrueを返す場合にのみtrueを返す条件を設定する方法はありますか?

_BOOL var1
BOOL var2
_

if((var1 && !var2) || (!var1 && var2))より短いもの

ありがとうございました

22
Nicolas Manzini

Objective-CはCのスーパーセットであるため、CのXOR演算子、つまり^を使用するだけです。

53
Cyrille

XOR

if(!!var1 != !!var2)
{
   NSLog(@"XOR condition");
}

感嘆符は変数をBOOLに変換します(キャストではなく実際の変換)
したがって、このソリューションは、変数がBOOLでなくても機能します。

!!(0|nil) ≡ 0  
!!(any other number|object) ≡ 1

これは、varの1つだけがnonnilであることを確認したい場合に役立ちます。

45
Ishu

これを行うことで、Ishuが提案するコードにさらにclearnessを追加できます。

#define XOR !=

そして、あなたはただ書く:

if (var1 XOR var2) {

    ...
}

真理値表の出力:
[T XOR T => F; T!= T => F]、
[T XOR F => T; T!= F => T]、
[F XOR T => T; F!= T => T]および
[F XOR F => F; F!= F => F]

3
Lukas Kalinski

マクロはオプションである可能性があります。これは同じ動作を維持しますが、より読みやすい方法になりました。

#define XOR(x,y) (((x) && !(y)) || (!(x) && (y)))

if(XOR(var1, var2) {

}
2
Danilo Gomes

try (int)var1 ^ (int)var2YESとNOは実際には次のように定義されています。

#define YES (BOOL)1
#define NO  (BOOL)0
0
fvwmer
if ((!var1)==var2) 
{
        NSLog(@"Yes");
}
0
Prasad G