Синтаксис метода в Objective C

Может кто-нибудь объяснить синтаксис объявления этого метода для меня? В этой функции возвращается количество строк UIPickerView (пользовательский интерфейс игрового автомата на iPhone). По моему мнению, метод называется "pickerView" и возвращает NSInteger.

Он передает указатель на UIPickerview с именем "pickerView"... во-первых, почему метод называется тем же именем, что и параметр?

Далее появляется параметр NSInteger, называемый компонентом, который сообщает нам, какой компонент мы подсчитываем для строк. Логика решения, которая находится в теле метода.

Что такое numberOfRowsInComponent? Кажется, что мы описываем возвращаемое значение, но оно находится в середине параметров.

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

    return[self.zips count];
}

Ответ 1

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

Я попытаюсь объяснить, что у вас здесь, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component.

  • - (NSInteger)
    Эта первая часть указывает, что это метод Objective C instance, который возвращает объект NSInteger. - (тире) указывает, что это метод instance, где + указывает, что это метод class. Первое значение в скобках - это возвращаемый тип метода.

  • pickerView:
    Эта часть является частью имени сообщения. полное имя сообщения в этом случае pickerView:numberOfRowsInComponent:. Среда выполнения Objective-C принимает эту информацию о методе и отправляет ее указанному получателю. В чистом C это будет выглядеть как NSInteger pickerView(UIPickerView* pickerView, NSInteger component). Однако, поскольку это Objective-C, дополнительная информация упакована в имя сообщения.

  • (UIPickerView*)pickerView
    Эта часть является частью ввода. Вход здесь имеет тип UIPickerView* и имеет локальное имя переменной pickerView.

  • numberOfRowsInComponent:
    Эта часть является второй частью имени . Как вы можете видеть здесь, имена сообщений разделяются, чтобы указать, какую информацию вы передаете получателю. Таким образом, если бы я должен был передать объект myObject с переменными foo и bar, я бы напечатал:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    в отличие от стиля С++:
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    Это последняя часть ввода. вход здесь имеет тип NSInteger и имеет локальное имя переменной.

Ответ 2

В Objective-C имя метода состоит из всех частей объявления, которые не являются аргументами и типами. Таким образом, это имя метода:

pickerView:numberOfRowsInComponent:

Метод будет эквивалентен функции C-стиля, которая выглядит следующим образом:

изменить: (благодаря Jarret Hardie):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

Ответ 3

В дополнение к предыдущим ответам, я просто хотел бы сказать, что методы Objective-C (или сообщения, если вы предпочитаете) имеют внешние и внутренние имена параметров.

Итак, в этом случае:

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

numberOfRowsInComponent - это внешнее имя, которое вы использовали бы при вызове этого метода извне.

И component - это внутреннее имя параметра, которое вы используете для ссылки на параметр внутри метода.

Надеюсь, это немного прояснит ситуацию.

Ответ 4

Мне кажется, что подписи Objective-C скорее напоминают предложения. Каждый параметр заслуживает частичного имени метода. Например, в C у нас может быть метод ( setPersonData​​strong > ) для установки некоторой информации о человеке:

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

и в Objective-C метод будет более описательным (setPersonName: andAge: andHeight:), например

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