Sintaxe do Método no Objetivo C

Alguém pode explicar essa syntax de declaração de método para mim? Nessa function, o número de linhas de um UIPickerView (interface de usuário de slot machine no iPhone) está sendo retornado. Pelo que entendi, o método é chamado de ‘ pickerView ‘ e retorna um NSInteger.

Ele passa em um ponteiro para o UIPickerview chamado ‘ pickerView ‘ … primeiro, por que o método é chamado o mesmo nome do parâmetro?

Em seguida, há um parâmetro NSInteger chamado componente, que nos indica para qual componente estamos contando as linhas. A lógica para decidir qual é o corpo do método.

O que é ‘ numberOfRowsInComponent ? Parece descrever o valor que estamos retornando, mas está no meio dos parâmetros.

 - (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == kStateComponent) return [self.states count]; return[self.zips count]; } 

Os methods Objective-C são projetados para serem auto-documentados, e são emprestados da rica tradição de Smalltalk.

Vou tentar explicar o que você tem aqui, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component .

  • - (NSInteger)
    Esta primeira parte indica que este é um método de instância do Objective C que retorna um object NSInteger. o - (traço) indica que este é um método de instância , onde um + indicaria que este é um método de class . O primeiro valor entre parênteses é o tipo de retorno do método.

  • pickerView:
    Esta parte é uma parte do nome da mensagem . O nome completo da mensagem , neste caso, é pickerView:numberOfRowsInComponent: O tempo de execução do Objective-C pega essas informações do método e as envia para o receptor indicado. Em C puro, isso pareceria
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component) . No entanto, como isso é Objective-C, informações adicionais são armazenadas no nome da mensagem.

  • (UIPickerView*)pickerView
    Esta parte faz parte da input . A input aqui é do tipo UIPickerView* e possui um nome de variável local do pickerView.

  • numberOfRowsInComponent:
    Esta parte é a segunda parte do nome da mensagem . Como você pode ver aqui, os nomes das mensagens são divididos para ajudar a indicar quais informações você está passando para o receptor. Assim, se eu fosse enviar uma mensagem a um object myObject com as variables ​​foo e bar, eu digitaria:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    ao contrário do estilo C ++:
    myObject.pickerView(foo, bar); .

  • (NSInteger)component
    Esta é a última parte da input . a input aqui é do tipo NSInteger e possui um nome de variável local do componente.

Em Objective-C, o nome de um método é composto de todas as partes da declaração que não são argumentos e tipos. O nome desse método seria, portanto:

 pickerView:numberOfRowsInComponent: 

O método seria equivalente a uma function de estilo C com a seguinte aparência:

edit: (com agradecimentos a Jarret Hardie ):

 NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component) 

Adicionando às respostas anteriores, gostaria apenas de dizer que os methods Objective-C (ou mensagens, se preferir) possuem nomes de parâmetros externos e internos .

Então, neste caso:

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

numberOfRowsInComponent é um nome externo que você usaria ao chamar esse método do lado de fora.

E component é o nome interno do parâmetro – nome que você usa para se referir ao parâmetro de dentro do método.

Espero que isso resolva um pouco.

Parece-me que as assinaturas do método Objective-C são mais parecidas com sentenças. Cada parâmetro merece uma parte no nome do método. Por exemplo, em C, poderíamos ter um método ( setPersonData ) para definir algumas informações sobre a pessoa:

 void setPersonData( char* name, int age, float height ) { 

e em Objective-C o método seria mais descritivo ( setPersonName: andAge: andHeight:) , como

 - (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {