22

有没有办法设置一个仅在两个组件之一返回 true 时才返回 true 的条件?

BOOL var1
BOOL var2

if((var1 && !var2) || (!var1 && var2))

谢谢

4

6 回答 6

55

由于 Objective-C 是 C 的超集,您只需使用 C 中的 XOR 运算符,即^.

于 2012-07-11T11:44:32.460 回答
45

异或

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

感叹号将 vars 转换为 BOOL(真正的转换,而不是强制转换)
所以即使您的变量不是 BOOL,此解决方案也有效。

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

这在您想确保只有一个 vars 是 nonnil 的情况下很有用。

于 2012-07-11T11:49:58.820 回答
3

您可以通过执行以下操作为 Ishu 建议的代码添加更多清晰度:

#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]

于 2014-11-06T23:32:21.050 回答
2

宏可能是一种选择。它将保持相同的行为,但现在以更易读的方式。

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

if(XOR(var1, var2) {

}
于 2016-02-10T14:02:42.613 回答
0

try (int)var1 ^ (int)var2 YES 和 NO 实际上定义如下:

#define YES (BOOL)1
#define NO  (BOOL)0
于 2012-07-11T11:50:12.977 回答
0
if ((!var1)==var2) 
{
        NSLog(@"Yes");
}
于 2012-07-11T12:08:36.233 回答