Как передать несколько параметров в Objective-C?

Я прочитал несколько сообщений о синтаксисе метода Objective-C, но полагаю, что не понимаю нескольких имен метода.

Я пытаюсь создать метод под названием getBusStops с параметрами NSString и NSTimeInterval и типом возврата NSMutableArray. Вот как я сконструировал метод, но он явно вызывает ошибки во время выполнения:

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

Я видел другой пример с методом:

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

Я не понимаю, почему у этого метода есть имя метода для каждого параметра. Должен ли я сделать то же самое с чем-то вроде:

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

person Atma    schedule 06.04.2009    source источник


Ответы (6)


Objective-C не имеет именованных параметров, поэтому все, что находится слева от двоеточия, является частью имени метода. Например,

getBusStops: forTime:

это имя метода. Название разбито, поэтому оно может быть более наглядным. Вы можете просто назвать свой метод

getBusStops: :

но это мало что говорит вам о втором параметре.

person Terry Wilcox    schedule 06.04.2009

Вам необходимо разделить каждое имя параметра как минимум знаком ":". Технически имя необязательно, но рекомендуется для удобства чтения. Итак, вы могли написать:

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

или то, что вы предложили:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
person E.M.    schedule 06.04.2009
comment
+1: аргументы функции Objective-C действительно позиционные, а не именованные, поэтому метка не является обязательной и предназначена для использования людьми. - person Jarret Hardie; 06.04.2009
comment
не уверен, почему forTime предпочтительнее в подписи, timeInterval можно использовать как второй параметр в функции, верно? - person galactica; 19.09.2018
comment
@galactica - Конечно, имя может быть любым, что вам больше всего подходит. В этом примере для единообразия используется терминология OP. - person E.M.; 21.09.2018
comment
Все еще не уверены, для чего forTime используется? - person mrgloom; 26.09.2018

Да; синтаксис метода Objective-C подобен этому по нескольким причинам; один из них - чтобы было понятно, какие параметры вы задаете. Например, если вы добавляете объект в NSMutableArray по определенному индексу, вы должны сделать это с помощью метода:

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

Этот метод называется insertObject:atIndex:, и ясно, что объект вставляется по указанному индексу.

На практике добавление строки «Hello, World!» в индексе 5 NSMutableArray, называемого array, будет вызываться следующим образом:

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

[array insertObject:obj atIndex:index];

Это также уменьшает двусмысленность между порядком параметров метода, гарантируя, что вы сначала передаете параметр объекта, а затем затем параметр индекса. Это становится более полезным при использовании функций, которые принимают большое количество аргументов, и уменьшает количество ошибок при передаче аргументов.

Более того, соглашение об именах методов таково, потому что Objective-C не поддерживает перегрузку; однако, если вы хотите написать метод, который выполняет ту же работу, но принимает разные типы данных, это можно сделать; возьмем, например, класс NSNumber; у этого есть несколько методов создания объектов, в том числе:

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

В таком языке, как C ++, вы просто перегрузите числовой метод, чтобы разрешить передачу различных типов данных в качестве аргумента; однако в Objective-C этот синтаксис позволяет реализовать несколько различных вариантов одной и той же функции путем изменения имени метода для каждого варианта функции.

person Alex Rozanski    schedule 06.04.2009
comment
требуются ли имена параметров во время вызова метода (отправки сообщения), если имя функции включает имена параметров? - person Naveen; 12.04.2010

Текст перед каждым параметром является частью имени метода. В вашем примере имя метода на самом деле

-getBusStops:forTime:

Каждый: представляет собой аргумент. При вызове метода имя метода разделяется на: s, а аргументы появляются после: s. например

[getBusStops: arg1 forTime: arg2]
person sigjuice    schedule 06.04.2009
comment
Думаю, вы забыли добавить название метода. - person Özgür; 02.04.2010

для метода создания:

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

для вызова метода:

[mymethods:self.contoCorrente withsecond:self.asecond];
person VITROXMAN    schedule 14.10.2015

(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

me:

(returnTypeOfSecontArgument) secondArgumentName ;

как и в других языках, мы используем следующий синтаксис void add(int one, int second), но способ назначения аргументов в OBJ_c отличается от описанного выше

person Chaudhry Umair    schedule 28.05.2016