Como passo vários parâmetros no Objective-C?

178

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

Estou tentando criar um método chamado getBusStopswith NSStringe NSTimeIntervalparameters e um tipo de retorno de NSMutableArray. Foi assim que construí o método, mas ele obviamente obtém erros no 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

Não entendo por que esse 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
Atma
fonte

Respostas:

120

O Objective-C não possui parâmetros nomeados; portanto, 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 é dividido para que possa ser mais descritivo. Você pode simplesmente nomear seu método

getBusStops: :

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

Terry Wilcox
fonte
157

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ê pode escrever:

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

ou o que você sugeriu:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
EM
fonte
15
+1: Os argumentos da função Objective-C são realmente posicionais, não nomeados, portanto o rótulo é opcional e para consumo humano.
Jarret Hardie
não sabe por que "forTime" é preferido na assinatura, "timeInterval" pode ser usado como o 2º parâmetro na função, certo?
Galactica
@ galactica - Claro, o nome pode ser o que fizer mais sentido para você. Este exemplo usa a terminologia do OP para obter consistência.
EM
2
Ainda não sabe para que forTimeserve?
Mrgloom 26/09/18
71

Sim; a sintaxe do método Objective-C é assim por duas razões; uma delas é para que fique claro quais são os parâmetros que você está especificando. Por exemplo, se você estiver adicionando um objeto a um NSMutableArrayem um determinado índice, você o faria usando o método:

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

Este método é chamado insertObject:atIndex:e é claro que um objeto está sendo inserido em um índice especificado.

Na prática, adicionando uma string "Olá, mundo!" no índice 5 de um NSMutableArraychamado arrayseria chamado da seguinte maneira:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

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

Além disso, a convenção de nomenclatura do método é semelhante porque o Objective-C não suporta sobrecarga; no entanto, se você quiser escrever um método que faça o mesmo trabalho, mas utilize tipos de dados diferentes, isso poderá ser feito; faça, por exemplo, a NSNumberaula; isso possui vários métodos de criação de objetos, incluindo:

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

Em uma linguagem como C ++, você simplesmente sobrecarregaria o método number para permitir que diferentes tipos de dados fossem transmitidos como argumento; no entanto, no Objective-C, essa sintaxe permite que várias variantes diferentes da mesma função sejam implementadas, alterando o nome do método para cada variante da função.

Alex Rozanski
fonte
são os nomes de parâmetros necessários durante a chamada do método (envio de mensagem) se o nome da função incluir nomes de parâmetros?
Naveen
24

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: se os argumentos aparecem após o: seg

[getBusStops: arg1 forTime: arg2]
sigjuice
fonte
3
Eu acho que você esqueceu de adicionar o nome do método.
Aprzgür
11

para o método create:

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

para chamar o método:

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

mim:

(returnTypeOfSecontArgument) secondArgumentName ;

como em outros idiomas, usamos a seguinte sintaxe void, add(int one, int second) mas a maneira de atribuir argumentos OBJ_cé diferente conforme descrito acima

Chaudhry Umair
fonte