Jak przekazać wiele parametrów w Objective-C?

178

Przeczytałem kilka postów na temat składni metody Objective-C, ale wydaje mi się, że nie rozumiem wielu nazw dla metody.

Próbuję utworzyć metody nazywanej getBusStopsze NSStringi NSTimeIntervalparametrów oraz typ zwracanej NSMutableArray. Oto jak skonstruowałem tę metodę, ale oczywiście powoduje ona błędy w czasie wykonywania:

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

Widziałem inny przykład z metodą:

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

Nie rozumiem, dlaczego ta metoda ma nazwę metody dla każdego parametru. Czy powinienem zrobić to samo z czymś takim:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval
Atma
źródło

Odpowiedzi:

120

Objective-C nie ma nazwanych parametrów, więc wszystko po lewej stronie dwukropka jest częścią nazwy metody. Na przykład,

getBusStops: forTime:

to nazwa metody. Nazwa jest podzielona, ​​więc może być bardziej opisowa. Możesz po prostu nazwać swoją metodę

getBusStops: :

ale to niewiele mówi o drugim parametrze.

Terry Wilcox
źródło
157

Musisz oddzielić każdą nazwę parametru przynajmniej znakiem „:”. Z technicznego punktu widzenia nazwa jest opcjonalna, ale jest zalecana ze względu na czytelność. Możesz więc napisać:

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

lub co zasugerowałeś:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
EM
źródło
15
+1: Argumenty funkcji celu-C są rzeczywiście pozycyjne, a nie nazwane, więc etykieta jest opcjonalna i przeznaczona do spożycia przez ludzi.
Jarret Hardie
nie wiem, dlaczego „forTime” jest preferowane w podpisie, „timeInterval” może być użyte jako drugi parametr funkcji, prawda?
galactica
@galactica - Oczywiście, nazwa może być taka, która ma dla Ciebie największy sens. W tym przykładzie zastosowano terminologię PO dla zachowania spójności.
EM
2
Nadal nie wiesz, do czego forTimesłuży?
mrgloom
71

Tak; składnia metody Objective-C jest taka z kilku powodów; jeden z nich jest taki, aby było jasne, jakie parametry określasz. Na przykład, jeśli dodajesz obiekt do NSMutableArrayokreślonego indeksu, możesz to zrobić za pomocą metody:

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

Ta metoda nazywa się insertObject:atIndex: i jest jasne, że obiekt jest wstawiany pod określonym indeksem.

W praktyce dodanie ciągu „Hello, World!” pod indeksem 5 NSMutableArraywezwania arraybędzie wyglądał następująco:

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

[array insertObject:obj atIndex:index];

Zmniejsza to również niejasności między kolejności parametrów metody, zapewniając, że zdasz parametr obiektu pierwsze, następnie parametr indeksu. Staje się to bardziej przydatne w przypadku korzystania z funkcji, które pobierają dużą liczbę argumentów i zmniejsza błędy w przekazywaniu argumentów.

Ponadto konwencja nazewnictwa metod jest taka, ponieważ Objective-C nie obsługuje przeciążania; jeśli jednak chcesz napisać metodę, która wykonuje to samo zadanie, ale przyjmuje różne typy danych, można to zrobić; weźmy na przykład NSNumberklasę; ma kilka metod tworzenia obiektów, w tym:

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

W języku takim jak C ++ wystarczy przeciążyć metodę number, aby umożliwić przekazywanie różnych typów danych jako argumentu; jednak w Objective-C składnia ta pozwala na implementację kilku różnych wariantów tej samej funkcji, poprzez zmianę nazwy metody dla każdego wariantu funkcji.

Alex Różański
źródło
czy nazwy parametrów są wymagane podczas wywołania metody (wysyłania wiadomości), jeśli nazwa funkcji zawiera nazwy parametrów?
Naveen
24

Tekst przed każdym parametrem jest częścią nazwy metody. Z twojego przykładu, nazwa metody to w rzeczywistości

-getBusStops:forTime:

Każdy: reprezentuje argument. W wywołaniu metody nazwa metody jest dzielona na: si argumenty pojawiają się po: seg

[getBusStops: arg1 forTime: arg2]
sigjuice
źródło
3
Myślę, że zapomniałeś dodać nazwę metody.
Özgür
11

dla metody tworzenia:

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

na wezwanie metoda:

[mymethods:self.contoCorrente withsecond:self.asecond];
VITROXMAN
źródło
-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

mnie:

(returnTypeOfSecontArgument) secondArgumentName ;

tak jak w innych językach używamy następującej składni void, add(int one, int second) ale sposób przypisywania argumentów OBJ_cjest inny niż opisano powyżej

Chaudhry Umair
źródło