Como faço para passar vários parâmetros no Objective-C?

Eu li vários posts sobre a syntax do método Objective-C, mas acho que não entendo vários nomes para um método.

Eu estou tentando criar um método chamado getBusStops com NSString e NSTimeInterval parâmetros e um tipo de retorno de NSMutableArray . É assim que eu construí o método, mas obviamente ele recebe erros em tempo de execução:

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

Eu vi outro exemplo com um método:

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

Eu não entendo porque este método tem um nome de método para cada parâmetro. Devo fazer o mesmo com algo como:

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

Objetivo-C não tem parâmetros nomeados, então tudo no lado esquerdo de dois-pontos faz parte do nome do método. Por exemplo,

 getBusStops: forTime: 

é o nome do método. O nome é quebrado para poder ser mais descritivo. Você poderia simplesmente nomear seu método

 getBusStops: : 

mas isso não diz muito sobre o segundo parâmetro.

Você precisa delimitar cada nome de parâmetro com um “:” no mínimo. Tecnicamente, o nome é opcional, mas é recomendado para facilitar a leitura. Então você poderia escrever:

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

ou o que você sugeriu:

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

Sim; a syntax do método Objective-C é assim por alguns motivos; um deles é para que fique claro quais são os parâmetros que você está especificando. Por exemplo, se você estiver adicionando um object a um NSMutableArray em um determinado índice, você o faria usando o método:

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

Esse método é chamado de insertObject:atIndex: e fica claro que um object está sendo inserido em um índice especificado.

Na prática, adicionar uma string “Hello, World!” no índice 5 de um array chamado NSMutableArray seria chamado da seguinte forma:

 NSString *obj = @"Hello, World!"; int index = 5; [array insertObject:obj atIndex:index]; 

Isso também reduz a ambigüidade entre a ordem dos parâmetros do método, garantindo que você passe primeiro o parâmetro do object e depois o parâmetro index. Isso se torna mais útil ao usar funções que recebem um grande número de argumentos e reduz o erro ao passar os argumentos.

Além disso, a convenção de nomenclatura do método é tal porque o Objective-C não suporta sobrecarga; entretanto, se você quiser escrever um método que faça o mesmo trabalho, mas tenha diferentes tipos de dados, isso pode ser feito; tome, por exemplo, a class NSNumber ; isso tem vários methods de criação de objects, incluindo:

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

Em uma linguagem como C ++, você simplesmente sobrecarregaria o método numérico para permitir que diferentes tipos de dados fossem passados ​​como argumento; no entanto, em Objective-C, essa syntax permite que várias variantes diferentes da mesma function sejam implementadas, alterando o nome do método para cada variante da function.

O texto antes de cada parâmetro faz parte do nome do método. Do seu exemplo, o nome do método é realmente

 -getBusStops:forTime: 

Cada um: representa um argumento. Em uma chamada de método, o nome do método é dividido em: s e os argumentos aparecem após o: seg

 [getBusStops: arg1 forTime: arg2] 

para o método de criação:

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

para chamar o método:

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

mim:

 (returnTypeOfSecontArgument) secondArgumentName ; 

como em outras linguagens usamos a seguinte syntax void add(int one, int second) mas a maneira de atribuir argumentos no OBJ_c é diferente como descrito acima