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