Wann Klammern zu verwenden sind und wann der Punkt in Objective-C verwendet werden soll

8

Ich bin ein neuer iPhone / Objective-C-Entwickler und da ich verschiedene Tutorials und Open-Source-Code durchführe, habe ich ein kleines Problem damit, zu verstehen, wann ich die eckigen Klammern "[]" und wann verwenden soll Verwenden Sie den Punkt "." für den Zugriff auf Eigenschaften / Methoden eines Objekts.

Zum Beispiel dieser Code:

%Vor%

Warum erhält [UIColor clearColor] Klammern, aber todoTextLabel.backgroundColor erhält die Periode?

Könnte mir jemand das leicht erklären?

    
James P. Wright 15.10.2009, 15:52
quelle

5 Antworten

18

Die Konvention, die ich im neuen Code gesehen habe, ist die Verwendung des Punkts für Eigenschaften und immer eckige Klammern für Nachrichten / Selektoren (was Sie Methoden nennen). Der Punkt wurde in Objective-C 2.0 eingeführt, so dass die Uneinigkeit der Informationen, die Sie online finden, nicht völlig unerwartet ist.

Es ist auch durchaus möglich, eckige Klammern für alles zu verwenden ( und ich ):

%Vor%

entspricht

%Vor%

Um zu wiederholen, sollten Sie den Punkt nicht für Nachrichten, sondern nur für Eigenschaften verwenden.

Um Ihre spezifische Frage zu beantworten, gehört [UIColor clearColor] in Klammern, da es keine Eigenschaft ist; es ist tatsächlich eine Klassennachricht an UIColor ( +(UIColor)clearColor ).

Sie klingen, als kämen Sie aus einer Java-Welt, also könnte dies hilfreich sein:

%Vor%

Die Meldungen "setXXX" und "XXX" stammen aus synthetisierten dynamischen Eigenschaften und sind ein Objective-C-Idiom. Der "Punkt" ist einfach eine Abkürzung für den Aufruf dieser Methoden und ist ungefähr gleichwertig.

BEARBEITEN: Jetzt, da ich ein paar Upvotes habe, ist es Zeit, dass einige von euch das überdenken:

Ich benutze nie Punkte, und Sie sollten auch nicht.

    
Jed Smith 15.10.2009, 16:04
quelle
5
___ qstnhdr ___ Wann Klammern zu verwenden sind und wann der Punkt in Objective-C verwendet werden soll ___ answer1577449 ​​___

Ich verwende Punktnotation für Eigenschaften, weil

%Vor%

ist etwas leichter zu lesen als

%Vor%

Im zweiten Fall wird die Lesbarkeit unterbrochen, indem das Gehirn in den Nachrichtensendemodus versetzt wird, während im ersten Fall klar ist, dass Sie auf die Personeneigenschaft des Gruppenobjekts zugreifen.

Ich werde es auch beim Ändern einer Sammlung verwenden, zum Beispiel:

%Vor%

ist etwas lesbarer als

%Vor%

Die Hervorhebung in diesem Fall sollte in der Aktion des Hinzufügens eines Objekts zu dem Array sein, anstatt zwei Nachrichten zu verketten.

    
___ answer1573353 ___

Die Konvention, die ich im neuen Code gesehen habe, ist die Verwendung des Punkts für Eigenschaften und immer eckige Klammern für Nachrichten / Selektoren (was Sie Methoden nennen). Der Punkt wurde in Objective-C 2.0 eingeführt, so dass die Uneinigkeit der Informationen, die Sie online finden, nicht völlig unerwartet ist.

Es ist auch durchaus möglich, eckige Klammern für alles zu verwenden ( und ich ):

%Vor%

entspricht

%Vor%

Um zu wiederholen, sollten Sie den Punkt nicht für Nachrichten, sondern nur für Eigenschaften verwenden.

Um Ihre spezifische Frage zu beantworten, gehört %code% in Klammern, da es keine Eigenschaft ist; es ist tatsächlich eine Klassennachricht an %code% ( %code% ).

Sie klingen, als kämen Sie aus einer Java-Welt, also könnte dies hilfreich sein:

%Vor%

Die Meldungen "setXXX" und "XXX" stammen aus synthetisierten dynamischen Eigenschaften und sind ein Objective-C-Idiom. Der "Punkt" ist einfach eine Abkürzung für den Aufruf dieser Methoden und ist ungefähr gleichwertig.

BEARBEITEN: Jetzt, da ich ein paar Upvotes habe, ist es Zeit, dass einige von euch das überdenken:

Ich benutze nie Punkte, und Sie sollten auch nicht.

    
___ tag123objectivec ___ Dieses Tag sollte nur bei Fragen verwendet werden, die sich auf Objective-C-Features beziehen oder von Code in der Sprache abhängen. Die Tags [Kakao] und [Kakao-Touch] sollten verwendet werden, um nach Frameworks oder Klassen von Apple zu fragen. Verwenden Sie die zugehörigen Tags [ios], [macos], [apple-watch] und [tvos] für Probleme, die für diese Plattformen spezifisch sind. ___ answer1573343 ___

Ja, ich habe gerade angefangen, das auch zu lernen:

Im Gegensatz zu anderen Sprachen ist die Syntax zum Aufrufen einer Methode für ein Objekt nicht objName.someMethod ();

Es ist [objName someMethod]

Der Punktoperator wird verwendet, um den Wert einer Eigenschaft in einer Klasse abzurufen oder festzulegen. Es ist ein kurzer Weg, etwas zu tun.

Der Punktoperator, wie ich ihn gesehen habe, wird immer für eine Instanz eines Objekts verwendet, während [...] entweder für eine Instanz eines Objekts oder statisch (unter Verwendung des Klassennamens) verwendet werden kann.

todoTextLabel kann das [] auch verwenden, aber mit dem Punktoperator ist nur eine kürzere Hand ... sonst müssten Sie Parameter usw. angeben, und das ist nur eine längere Notation.

Ich hoffe, das hat geholfen.

    
___ answer1573430 ___

Nach der (starken) Konvention werden Eigenschaftenaccessoren als Methoden geschrieben, die nach der Instanzvariablen für den Getter und dem Namen der (in Großbuchstaben geschriebenen) Instanzvariablen mit dem Präfix "set" für den Setter benannt sind (also beispielsweise die Variable foo, die Sie haben) foo und setFoo).

Wie andere bereits darauf hingewiesen haben, wird ab Objective-C 2.0, wenn Sie object.foo schreiben, auf den Methodenaufruf [object foo] beim Abrufen oder auf [object setFoo: arg] zum Festlegen abbilden. Sie können jedes Formular verwenden, und einige Leute bevorzugen weiterhin die vollständige Methoden-Syntax, selbst wenn Sie ausschließlich Objective-C 2.0 verwenden.

Eine separate, aber verwandte Ergänzung zu Objective-C 2.0 sind die @ property / @ synthesize / @ dynamic-Schlüsselwörter zum Generieren der Getter und Setter. Sie können diese mit Punktnotation mischen und abgleichen - die eine benötigt die andere nicht.

    
___ qstntxt ___

Ich bin ein neuer iPhone / Objective-C-Entwickler und da ich verschiedene Tutorials und Open-Source-Code durchführe, habe ich ein kleines Problem damit, zu verstehen, wann ich die eckigen Klammern "[]" und wann verwenden soll Verwenden Sie den Punkt "." für den Zugriff auf Eigenschaften / Methoden eines Objekts.

Zum Beispiel dieser Code:

%Vor%

Warum erhält %code% Klammern, aber %code% erhält die Periode?

Könnte mir jemand das leicht erklären?

    
___ answer1573427 ___

Big Nerd Ranch hat einige Gedanken zur Punktnotation, die es wert sind, gelesen zu werden.

Es gibt auch eine Widerlegung .

    
___
rebo 16.10.2009 11:04
quelle
3
2

Nach der (starken) Konvention werden Eigenschaftenaccessoren als Methoden geschrieben, die nach der Instanzvariablen für den Getter und dem Namen der (in Großbuchstaben geschriebenen) Instanzvariablen mit dem Präfix "set" für den Setter benannt sind (also beispielsweise die Variable foo, die Sie haben) foo und setFoo).

Wie andere bereits darauf hingewiesen haben, wird ab Objective-C 2.0, wenn Sie object.foo schreiben, auf den Methodenaufruf [object foo] beim Abrufen oder auf [object setFoo: arg] zum Festlegen abbilden. Sie können jedes Formular verwenden, und einige Leute bevorzugen weiterhin die vollständige Methoden-Syntax, selbst wenn Sie ausschließlich Objective-C 2.0 verwenden.

Eine separate, aber verwandte Ergänzung zu Objective-C 2.0 sind die @ property / @ synthesize / @ dynamic-Schlüsselwörter zum Generieren der Getter und Setter. Sie können diese mit Punktnotation mischen und abgleichen - die eine benötigt die andere nicht.

    
philsquared 15.10.2009 16:14
quelle
0

Ja, ich habe gerade angefangen, das auch zu lernen:

Im Gegensatz zu anderen Sprachen ist die Syntax zum Aufrufen einer Methode für ein Objekt nicht objName.someMethod ();

Es ist [objName someMethod]

Der Punktoperator wird verwendet, um den Wert einer Eigenschaft in einer Klasse abzurufen oder festzulegen. Es ist ein kurzer Weg, etwas zu tun.

Der Punktoperator, wie ich ihn gesehen habe, wird immer für eine Instanz eines Objekts verwendet, während [...] entweder für eine Instanz eines Objekts oder statisch (unter Verwendung des Klassennamens) verwendet werden kann.

todoTextLabel kann das [] auch verwenden, aber mit dem Punktoperator ist nur eine kürzere Hand ... sonst müssten Sie Parameter usw. angeben, und das ist nur eine längere Notation.

Ich hoffe, das hat geholfen.

    
vinnybad 15.10.2009 16:03
quelle

Tags und Links