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


178

Я прочитал несколько постов о синтаксисе метода 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

Ответы:


120

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

getBusStops: forTime:

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

getBusStops: :

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


157

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

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

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

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

15
+1: аргументы функции Objective-C действительно позиционные, а не именованные, поэтому метка является необязательной и предназначена для использования человеком.
— Джаррет Харди

не уверен, почему в сигнатуре предпочтительнее forTime, в качестве второго параметра функции можно использовать timeInterval, верно?
— Галактика

@galactica - Конечно, имя может быть любым, что имеет для вас наибольшее значение. В этом примере используется терминология OP для согласованности.
— EM

2
Все еще не уверены, для чего forTimeиспользуется?
— mrgloom

71

Да; синтаксис метода 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 этот синтаксис позволяет реализовать несколько различных вариантов одной и той же функции, изменяя имя метода для каждого варианта функции.


имена параметров требуются во время вызова метода (отправки сообщения), если имя функции включает имена параметров?
— Навин

24

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

-getBusStops:forTime:

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

[getBusStops: arg1 forTime: arg2]

3
Я думаю, что вы забыли добавить название метода.
— Озгюр

11

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

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

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

[mymethods:self.contoCorrente withsecond:self.asecond];

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

меня:

(returnTypeOfSecontArgument) secondArgumentName ;

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.