XOR Objective-c

Есть ли способ поставить условие, возвращающее true, только если один из двух компонентов возвращает true?

BOOL var1
BOOL var2

чем-то короче if((var1 && !var2) || (!var1 && var2))

Спасибо

Ответы

Ответ 1

Поскольку Objective-C является надмножеством C, вы просто используете оператор XOR из C, который является ^.

Ответ 2

XOR

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

Восклицательные знаки преобразуют vars в BOOL (реальное преобразование, а не литье)
Таким образом, это решение работает, даже если ваши переменные не являются BOOL.

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

Это полезно в тех случаях, когда вы хотите быть уверенным, что только один из vars является nonnil.

Ответ 3

Вы можете добавить еще clearness к коду, который предлагает 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]

Ответ 4

Макросом может быть опция. Он будет придерживаться такого же поведения, но теперь более читаемым способом.

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

if(XOR(var1, var2) {

}

Ответ 5

попробуйте (int)var1 ^ (int)var2 ДА и НЕТ на самом деле определяются следующим образом:

#define YES (BOOL)1
#define NO  (BOOL)0

Ответ 6

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