Как передать несколько параметров в Objective-C? - PullRequest
168 голосов
/ 06 апреля 2009

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

Ответы [ 6 ]

150 голосов
/ 06 апреля 2009

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

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

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

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
109 голосов
/ 06 апреля 2009

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

getBusStops: forTime:

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

getBusStops: :

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

64 голосов
/ 06 апреля 2009

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

23 голосов
/ 06 апреля 2009

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

-getBusStops:forTime:

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

[getBusStops: arg1 forTime: arg2]
6 голосов
/ 14 октября 2015

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

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

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

[mymethods:self.contoCorrente withsecond:self.asecond];
0 голосов
/ 28 мая 2016
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

я:

(returnTypeOfSecontArgument) secondArgumentName ;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...