2012-07-11 3 views
20

Gibt es eine Möglichkeit, eine Bedingung zurückzugeben, die nur dann true zurückgibt, wenn eine der beiden Komponenten wahr ist?XOR Objective-c

BOOL var1 
BOOL var2 

etwas kürzer als if((var1 && !var2) || (!var1 && var2))

Danke

+7

können Sie diese if (var1^var2) verwenden – Siddiqui

Antwort

54

Als Objective-C ist eine Obermenge von C, verwenden Sie einfach den XOR-Operator von C, das ^ ist.

+18

dass die bitweise XOR ist, wenn Sie eine logische XOR wollen, verwenden Sie einfach '! = '. –

+2

Keine Lösung wird die ganze Zeit funktionieren. Ein BOOL kann eine beliebige Ganzzahl sein. Beides wird fehlschlagen, wenn beide Werte ungleich Null, aber ungleich sind. Die robusteste Option ist wahrscheinlich, sie vollständig zu schreiben, wie die ursprüngliche Frage. –

+1

@DrewMcCormack, um dieses Problem zu vermeiden, können Sie jeden Typ mit zwei Ausrufezeichen in echte 'BOOL' konvertieren. '!! var1! = !! var2' – DanSkeel

42

XOR

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

Ausrufezeichen konvertieren Vars BOOL (real Umwandlung, nicht Gießen)
So diese Lösung funktioniert auch, wenn Sie Ihre Variablen nicht BOOL sind.

Dies ist nützlich in Fällen, in denen Sie sicher sein wollen, dass nur einer von vars nicht nil ist.

+0

kurz, elegant, einfach und einfach – meronix

+0

Standardmäßig ist die BOOL-Variable NEIN. In diesem Zustand denke ich, dass es fehlschlägt. Überprüfen Sie es –

+0

Ich mag dieses eine BTW aber die Karotte kann akademischer sein Dank für die Antwort –

0

versuchen (int)var1^(int)var2 YES und NO können folgend tatsächlich definiert:

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

Sie könnten mehr Klarheit auf den Code hinzufügen, die Ishu, indem Sie diese schlägt vor:

#define XOR != 

und dann schreibst du einfach:

if (var1 XOR var2) { 

    ... 
} 

Wahrheitstabelle Ausgabe:
[T XOR T => F; T! = T => F],
[T XOR F => T; T! = F => T],
[F XOR T => T; F! = T => T] und
[F XOR F => F; F! = F => F]

+0

Dies ist nicht xor –

+0

@AlberRenshaw Ja ist es, weil es in der gleichen Wahrheitstabelle ergibt: [T XOR T => F; T! = T => F], [T XOR F => T; T! = F => T], [F XOR T => T; F! = T => T] und [F XOR F => F; F! = F => F]. –

+1

Woah, du hast Recht. Ich fühle mich wirklich sehr dumm, das nicht zu bemerken! Danke, dass sie mich belehrt haben –

2

Ein Makro könnte eine Option sein. Es wird das gleiche Verhalten beibehalten, aber jetzt lesbarer.

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

if(XOR(var1, var2) { 

} 
Verwandte Themen