Ответ 1
Поскольку Objective-C является надмножеством C, вы просто используете оператор XOR из C, который является ^
.
Есть ли способ поставить условие, возвращающее true, только если один из двух компонентов возвращает true?
BOOL var1
BOOL var2
чем-то короче if((var1 && !var2) || (!var1 && var2))
Спасибо
Поскольку Objective-C является надмножеством C, вы просто используете оператор XOR из C, который является ^
.
XOR
if(!!var1 != !!var2)
{
NSLog(@"XOR condition");
}
Восклицательные знаки преобразуют vars в BOOL (реальное преобразование, а не литье)
Таким образом, это решение работает, даже если ваши переменные не являются BOOL.
!!(0|nil) ≡ 0
!!(any other number|object) ≡ 1
Это полезно в тех случаях, когда вы хотите быть уверенным, что только один из vars является nonnil.
Вы можете добавить еще 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]
Макросом может быть опция. Он будет придерживаться такого же поведения, но теперь более читаемым способом.
#define XOR(x,y) (((x) && !(y)) || (!(x) && (y)))
if(XOR(var1, var2) {
}
попробуйте (int)var1 ^ (int)var2
ДА и НЕТ на самом деле определяются следующим образом:
#define YES (BOOL)1
#define NO (BOOL)0
if ((!var1)==var2)
{
NSLog(@"Yes");
}