Wie übergebe ich mehrere Parameter in Objective-C?

177

Ich habe einige Beiträge über die Objective-C-Methodensyntax gelesen, aber ich glaube, ich verstehe nicht mehrere Namen für eine Methode.

Ich versuche, eine Methode getBusStopsmit NSStringund NSTimeIntervalParametern und einen Rückgabetyp von zu erstellen NSMutableArray. So habe ich die Methode konstruiert, aber zur Laufzeit werden offensichtlich Fehler angezeigt:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

Ich habe ein anderes Beispiel mit einer Methode gesehen:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

Ich verstehe nicht, warum diese Methode für jeden Parameter einen Methodennamen hat. Soll ich dasselbe mit so etwas machen wie:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval
Atma
quelle

Antworten:

119

Objective-C hat keine benannten Parameter, daher ist alles auf der linken Seite eines Doppelpunkts Teil des Methodennamens. Beispielsweise,

getBusStops: forTime:

ist der Name der Methode. Der Name ist aufgeschlüsselt, damit er aussagekräftiger sein kann. Sie können einfach Ihre Methode benennen

getBusStops: :

Aber das sagt nicht viel über den zweiten Parameter aus.

Terry Wilcox
quelle
157

Sie müssen jeden Parameternamen mindestens mit einem ":" abgrenzen. Technisch gesehen ist der Name optional, wird jedoch aus Gründen der Lesbarkeit empfohlen. Sie könnten also schreiben:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

oder was du vorgeschlagen hast:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
EM
quelle
15
+1: Objective-C-Funktionsargumente sind in der Tat positionell und nicht benannt, daher ist die Bezeichnung optional und für den menschlichen Gebrauch bestimmt.
Jarret Hardie
Sie sind sich nicht sicher, warum "forTime" in der Signatur bevorzugt wird. "timeInterval" kann als zweiter Parameter in der Funktion verwendet werden, oder?
Galactica
@galactica - Sicher, der Name kann alles sein, was für Sie am sinnvollsten ist. In diesem Beispiel wird aus Gründen der Konsistenz die Terminologie des OP verwendet.
EM
2
Sie sind sich noch nicht sicher, wofür forTimeverwendet wird?
Mrgloom
71

Ja; Die Syntax der Objective-C-Methode ist aus mehreren Gründen so. Eine davon ist, damit klar ist, welche Parameter Sie angeben. Wenn Sie beispielsweise einem Objekt NSMutableArrayan einem bestimmten Index ein Objekt hinzufügen , gehen Sie folgendermaßen vor:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

Diese Methode wird aufgerufen insertObject:atIndex:und es ist klar, dass ein Objekt an einem angegebenen Index eingefügt wird.

In der Praxis wird eine Zeichenfolge "Hallo Welt!" bei Index 5 eines NSMutableArraygenannt arraywürde wie folgt aufgerufen werden:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

Dies verringert auch die Mehrdeutigkeit zwischen der Reihenfolge der Methodenparameter und stellt sicher, dass Sie zuerst den Objektparameter und dann den Indexparameter übergeben. Dies ist nützlicher, wenn Funktionen verwendet werden, die eine große Anzahl von Argumenten annehmen, und verringert den Fehler beim Übergeben der Argumente.

Darüber hinaus ist die Namenskonvention für Methoden so, da Objective-C keine Überladung unterstützt. Wenn Sie jedoch eine Methode schreiben möchten, die denselben Job ausführt, jedoch unterschiedliche Datentypen verwendet, kann dies erreicht werden. Nehmen Sie zum Beispiel die NSNumberKlasse; Dies hat mehrere Methoden zur Objekterstellung, einschließlich:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

In einer Sprache wie C ++ würden Sie einfach die Zahlenmethode überladen, damit verschiedene Datentypen als Argument übergeben werden können. In Objective-C können mit dieser Syntax jedoch mehrere verschiedene Varianten derselben Funktion implementiert werden, indem der Name der Methode für jede Variante der Funktion geändert wird.

Alex Rozanski
quelle
Sind die Parameternamen während des Methodenaufrufs (Nachrichtensendung) erforderlich, wenn der Funktionsname Parameternamen enthält?
Naveen
24

Der Text vor jedem Parameter ist Teil des Methodennamens. In Ihrem Beispiel lautet der Name der Methode tatsächlich

-getBusStops:forTime:

Jedes: repräsentiert ein Argument. Bei einem Methodenaufruf wird der Methodenname bei: s aufgeteilt und Argumente werden nach: seg angezeigt

[getBusStops: arg1 forTime: arg2]
Sigjuice
quelle
3
Ich denke, Sie haben vergessen, den Namen der Methode hinzuzufügen.
Özgür
11

für Erstellungsmethode:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

für den Aufruf der Methode:

[mymethods:self.contoCorrente withsecond:self.asecond];
VITROXMAN
quelle
-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

mich:

(returnTypeOfSecontArgument) secondArgumentName ;

Wie in anderen Sprachen verwenden wir die folgende Syntax void, add(int one, int second) aber die Art der Zuweisung von Argumenten in OBJ_cunterscheidet sich wie oben beschrieben

Chaudhry Umair
quelle