Methodensyntax in Objective C

Kann jemand diese Methodendeklarationssyntax für mich erklären? In dieser function wird die Anzahl der Zeilen eines UIPickerView (Slot Machine UI auf dem iPhone) zurückgegeben. Aus meiner pickerView wird die Methode ‘ pickerView ‘ genannt und gibt einen NSInteger zurück.

Es übergibt einen pointers auf die UIPickerview namens ‘ pickerView ‘ … zuerst, warum heißt die Methode den gleichen Namen wie der Parameter?

Als nächstes gibt es den NSInteger-Parameter namens component, der uns sagt, für welche Komponente wir die Zeilen zählen. Die Logik zu entscheiden, welche im Körper der Methode ist.

Was ist ‘ numberOfRowsInComponent ? Es scheint den Wert zu beschreiben, den wir zurückgeben, aber er befindet sich in der Mitte der Parameter.

 - (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == kStateComponent) return [self.states count]; return[self.zips count]; } 

   

Objective-C-Methoden sind so konzipiert, dass sie selbstdokumentieren und aus der reichen Tradition von Smalltalk stammen.

Ich werde versuchen zu erklären, was Sie hier haben, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component .

  • - (NSInteger)
    Dieser erste Teil zeigt an, dass dies eine Objective-C- Instanzmethode ist, die ein NSInteger-Objekt zurückgibt. Das - (Bindestrich) zeigt an, dass dies eine Instanzmethode ist, wobei ein + anzeigen würde, dass dies eine classnmethode ist. Der erste Wert in Klammern ist der Rückgabetyp der Methode.

  • pickerView:
    Dieser Teil ist ein Teil des Nachrichtennamens . Der vollständige Nachrichtenname ist in diesem Fall pickerView:numberOfRowsInComponent: Die Objective-C-Laufzeit nimmt diese Methodeninformation und sendet sie an den angegebenen Empfänger. In reinem C würde das so aussehen
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component) . Da dies Objective-C ist, werden jedoch zusätzliche Informationen in den Nachrichtennamen gepackt.

  • (UIPickerView*)pickerView
    Dieser Teil ist Teil der Eingabe . Die Eingabe hier ist vom Typ UIPickerView* und hat den lokalen Variablennamen pickerView.

  • numberOfRowsInComponent:
    Dieser Teil ist der zweite Teil des Nachrichtennamens . Wie Sie hier sehen können, werden die Nachrichtennamen aufgeteilt, um anzuzeigen, welche Informationen Sie an den Empfänger übergeben. Wenn ich also ein Objekt myObject mit den Variablen foo und bar benachrichtigen würde, würde ich Folgendes eingeben:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    im Gegensatz zu C ++ – Stil:
    myObject.pickerView(foo, bar); .

  • (NSInteger)component
    Dies ist der letzte Teil der Eingabe . Die Eingabe hier ist vom Typ NSInteger und hat einen lokalen Variablennamen der Komponente.

In Objective-C besteht der Name einer Methode aus allen Teilen der Deklaration, die keine Argumente und Typen sind. Der Name dieser Methode würde daher lauten:

 pickerView:numberOfRowsInComponent: 

Die Methode würde einer C-Style-function entsprechen, die folgendermaßen aussieht:

edit: (mit Dank an Jarret Hardie ):

 NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component) 

Hinzufügen zu den vorherigen Antworten möchte ich nur sagen, dass Objective-C-Methoden (oder Nachrichten, wenn Sie bevorzugen) externe und interne Parameternamen haben.

Also in diesem Fall:

 - (NSInteger) PickerView: (UIPickerView *) PickerView 
  numberOfRowsInComponent: (NSInteger) -Komponente

numberOfRowsInComponent ist der externe Name, den Sie verwenden würden, wenn Sie diese Methode von außen aufrufen.

Und component ist der interne Name des Parameters – Name, den Sie verwenden, um sich auf einen Parameter innerhalb der Methode zu beziehen.

Hoffnung, die es auftriggers.

Es scheint mir, dass Objective-C-Methodensignaturen eher wie Sätze sind. Jeder Parameter verdient einen Teil des Methodennamens. Zum Beispiel könnten wir in C eine Methode ( setPersonData ) zum Einstellen einiger Informationen über die Person haben:

 void setPersonData( char* name, int age, float height ) { 

und in Objective-C wäre die Methode anschaulicher ( setPersonName: andAge: andHeight:) , like

 - (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {