Синтаксис метода в Задаче C - PullRequest
176 голосов
/ 25 марта 2009

Может кто-нибудь объяснить этот синтаксис объявления метода для меня? В этой функции возвращается количество строк 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];
}

Ответы [ 4 ]

356 голосов
/ 25 марта 2009

Методы 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
    Эта часть является частью input . Входные данные имеют тип UIPickerView* и имеют имя локальной переменной pickerView.

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

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

52 голосов
/ 25 марта 2009

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

pickerView:numberOfRowsInComponent:

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

редактировать: (с благодарностью Джаррет Харди ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)
28 голосов
/ 02 апреля 2009

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

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

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

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

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

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

21 голосов
/ 11 ноября 2010

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

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

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

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...