Синтаксис метода в 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 у нас может быть метод ( setPersonDatastrong > ) для установки некоторой информации о человеке:
void setPersonData( char* name, int age, float height ) {
и в Objective-C метод будет более описательным (setPersonName: andAge: andHeight:), например
- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {