2009-04-06 5 views
155

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

ответ

102

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

getBusStops: forTime: 

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

getBusStops: : 

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

137

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

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

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

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

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

61

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

+0

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

23

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

-getBusStops:forTime: 

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

[getBusStops: arg1 forTime: arg2] 
+3

Я думаю, вы забыли добавить имя метода. –

4

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

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second { } 

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

[mymethod:self.contoCorrente withsecond:self.asecond]; 
-2
(int) add: (int) numberOne plus: (int) numberTwo ; 
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa 

мне:

(returnTypeOfSecontArgument) secondArgumentName ; 

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

Смежные вопросы