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


176

Чи може хтось пояснити для мене синтаксис декларації цього методу? У цій функції повертається кількість рядків 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];
}

Відповіді:


358

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

Я спробую пояснити , що ви тут, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component.

  • - (NSInteger)
    Ця перша частина вказує, що це метод екземпляра Objective C, який повертає об'єкт NSInteger. -(Тире) вказує на те, що це екземпляр методу, в якому +буде означати , що це клас метод. Перше значення в дужках - це тип повернення методу.

  • pickerView:
    Ця частина є частиною назви повідомлення . Повне ім'я повідомлення в даному випадку pickerView:numberOfRowsInComponent:. Виконання Objective-C приймає інформацію про цей метод і надсилає його вказаному приймачу. У чистому С це виглядатиме так
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component). Однак, оскільки це Objective-C, додаткова інформація упаковується у назву повідомлення.

  • (UIPickerView*)pickerView
    Ця частина є частиною вхідних даних . Тут вводиться тип UIPickerView*і має локальну назву змінної pickerView.

  • numberOfRowsInComponent:
    Ця частина є другою частиною імені повідомлення . Як ви бачите тут, імена повідомлень розбиті, щоб допомогти вказати, яку інформацію ви передаєте одержувачу. Таким чином, якби я до повідомлення об'єкт MyObject з Foo і бар змінних, я друкую б:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    на відміну від стилю C ++:
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    Це остання частина вводу . вхід тут має тип NSIntegerі має локальну назву змінної компонента.


18
+1 за чудову відповідь. Я б запропонував змінити "фабрику" на "клас" у вашій першій точці, оскільки "+" офіційно вказує на метод класу. Так буває, що багато "+" методів є заводськими методами, але це не є правильним визначенням.
e.James

2
Дякую! Ще одне додаткове запитання: Якщо ви мали б повідомлення об’єкту myObject зі змінними foo та bar, як ви показали: [myObject pickerView: foo numberOfRowsInComponent: bar]; Чи позначає pickerView ім'я методу чи параметр?
Крейг

2
Ні. Для нього гарним стилем є посилання як на ім'я методу, так і на параметр, але повна назва методу насправді pickerView: numberOfRowsInComponent :. Якщо ви намагаєтеся викликати pickerView :, ви отримаєте помилку виконання, оскільки метод не існував.
locriani

1
Дозвольте мені уточнити з цього приводу: сама частина pickerView: ДОЛЖЕН би посилатися на наступний параметр, щоб дотримуватися хорошого стилю кодування. Однак це лише 1/2 назви методу. Кращим прикладом може бути [myObject setX: foo Y: bar], де методом встановленоX: Y :.
locriani

1
Я знаю, що ця відповідь стара, але я живу у світі .NET останні кілька років. Я новачок у «Цілі C» та переході з веб-світу в індустрію мобільних пристроїв. Я хотів би подякувати вам за таке добре задокументоване пояснення, яке так важливо для питання. +1
d3v1lman1337

52

У Objective-C назва методу складається з усіх частин декларації, які не є аргументами та типами. Тому назва цього методу буде таким:

pickerView:numberOfRowsInComponent:

Метод був би еквівалентний функції в стилі С, яка виглядала так:

редагувати: (завдяки Джарре Харді ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1 - хороший короткий опис. Іноді я знаходжу, що лампочка працює для людей, якщо ви пишете еквівалент стилю C як "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView, компонент NSInteger)
Jarret Hardie,

мені подобається ваше пояснення, переписувати на C набагато краще.
lcc

30

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

Отже, у цьому випадку:

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

numberOfRowsInComponent- це зовнішнє ім'я, яке ви б використовували при виклику цього методу ззовні.

І componentце внутрішня назва параметра, той, який ви використовуєте для позначення параметра зсередини методу.

Сподіваюся, що це трохи очистить.


1
Відповідно до вашого опису, назва методу може розглядатися як зовнішня назва першого параметра. Це також відповідає коментарям wilczarz нижче.
Джейк

Чорт, я вважаю цю відповідь такою неправильною. Немає нічого подібного до зовнішньої / внутрішньої назви параметрів. Це ідентифікатор TYPE та VARIABLE. Цікаво, чому всі намагаються так важко визначити ObjC як природну мову, її просто неприродну в усіх своїх відношеннях. Мова його, ось це, дозволяє просто вивчити її, не використовуючи при цьому вигадливих слів.
Сіддхарт

Аргументи можуть мати внутрішні / зовнішні назви. Це правда.
lcc

21

Мені здається, що підписи методу 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 {

8
І чому встановлення "Особисті дані" (char * andName, int alsoAge, float alsoHeight) не має сенсу? Це все про те, що ви розумієте про синтаксис, нічого про намір дизайнерів objc бути розумними тут. вони просто додали купу синтаксису, який, чесно кажучи, не мав сенсу .. :)
Сіддхарт

5
Ви неправильно зрозуміли відповідь, яку я боюся. setPersonalData (char * andName, int alsoAge, float alsoHeight) - це підпис, а не виклик. Викликання цієї функції було б встановленеPersonData ("Том", 25, 175) - і це не означає, чи багато це робить? Викликання Obj-C виглядатиме так: [person setPersonName: @ "Tom" andAge: 25 andHeight: 175];
wilczarz

3
Тепер, коли я замислююся над цим, моя відповідь - це скоріше скарга, ніж заява. Я не міг більше погодитися.
Сіддхарт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.