2010-06-17 28 views
20

war nur ein Code-Review zu tun und begann sich zu fragen:if (self = [super init]) vs. if ((self = [super init]))

Ich dachte if (self = [super init]) überprüft, ob Rückgabewert von [super init] zuweisen zu Variable self war erfolgreich oder nicht (Wert der Operation). Somit wäre (self = nil) eigentlich TRUE.

Ich dachte, if ((self = [super init])) überprüft, was der Wert self nach der Zuweisung ist (Wert der Variablen). Somit wäre ((self = nil))FALSE.

Welcher ist der richtige Weg, um eigene Klassen zu initialisieren? Die Apple-Dokumentation verwendet die frühere (for example here), den Stil, den ich jetzt tatsächlich verwende.

Antwort

18

Beide machen das gleiche. Die Sache, die der if auswertet, ist der Wert des Ausdrucks darin, der der zugewiesene Wert in einer Zuweisung ist. Wenn also self nicht Null ist, gehen Sie in den Block if über.

Die zweite Form wirft Parens um ihn herum, um mögliche Compiler-Warnungen über Zuweisungen innerhalb von Bedingungen zu unterdrücken, was in der Regel eine schlechte Praxis und möglicherweise ein Tippfehler ist. Aber das ist idiomatisches Objective-C, also ist es in Ordnung, es auf die erste Art zu machen.

+0

Danke für die Klärung, was der Ausdruck macht - und warum ich dachte, dass es zusätzliche Klammern geben muss! Jetzt erinnere ich mich daran, solche Compilerwarnungen in anderen Umgebungen zu erhalten und eine zweite Klammer hinzuzufügen (nachdem ich den Ausdruck überprüft hatte, tat er natürlich, was ich wollte). – JOM

4

"Ein Zuweisungsausdruck hat den Wert des linken Operanden nach der Zuweisung" (C99), also hat er entweder den Wert der Variablen, wie Sie es nennen. Die zusätzlichen Klammern machen keinen Unterschied (außer möglicherweise für Warnungen).

12

Wie andere gesagt haben, sind die Klammern in diesem Fall nicht wichtig. Wo sie die Materie, wenn Sie ausdrücklich gegen Null überprüfen:

if (self = [super init] != nil) // wrong! 

if ((self = [super init]) != nil) // right 

= hat höhere Priorität als = so im ersten Fall, dass Sie das Boolesche Ergebnis von [super init] != nil (wahrscheinlich true) selbst zuweisen und dann funktioniert der Test für das wenn.

Persönlich interessiere ich mich nicht für beide, sondern bevorzuge die Zuweisung explizit außerhalb des Tests. Dies ist ein Spiegelbild meines Programmierhintergrunds, der mich zu dem Glauben geführt hat, dass Boolesche Typen von Ganzzahlen und Zeigern verschieden sind und dass Zuweisungen keine Ausdrücke sind, obwohl ich im Falle der C-Implementierung falsch liege.

self = [super init]; 
if (self != nil) 
+0

Gute Erinnerung über den Vorrang! – JOM

Verwandte Themen