Семантика методов Objective-C - PullRequest
2 голосов
/ 28 октября 2010

Исходя из фона Java, я до сих пор не совсем понимаю семантику методов Objective-C, в отличие от их синтаксиса . Возьмем для примера следующий метод:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

Достаточно просто. Существует метод с именем numberOfSectionsInTableView , который принимает UITableView в качестве параметра и возвращает NSInteger . Теперь, как насчет этих методов:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

Как мне интерпретировать эти методы? Я наткнулся на три возможных объяснения:

1) Все три метода называются tableView , и они перегружены различными параметрами. Это кажется маловероятным, поскольку люди говорят о «вызове метода numberOfRowsInSection ».

2) Методы имеют имена numberOfRowsInSection , heightForRowAtIndexPath и cellForRowAtIndexPath , а tableView является артефактом из-за делегирования. В таком случае, что именно синтаксически означает деталь tableView ? Если формат метода - «(возвращаемое) имя: параметры», куда вписывается tableView ?

3) Поскольку Objective-C использует передачу сообщений, неправильно думать о методах. Скорее подумайте о передаче сообщений объекту напрямую. Другими словами, если объект получает сообщения с именами tableView и numberOfRowsInSection , он знает, что нужно выполнить определенную часть кода. Если это так, имеет ли значение порядок? Передает numberOfRowsInSection и tableView то же самое, что и передача tableView и numberOfRowsInSection ?

Ответы [ 3 ]

3 голосов
/ 28 октября 2010

Имя (или селектор, на языке Objective-C) метода включает в себя все части имени. Например, посмотрите на эти три метода, каждый из которых может сосуществовать в одном классе:

- (void)foo;                       // named 'foo'
- (void)foo:(int)bar;              // named 'foo:'
- (void)foo:(int)bar baz:(int)qux; // named 'foo:baz:'

Обратите внимание на двоеточие в названии версии "foo", которая принимает параметр: это важно. Количество параметров, которые принимает метод, является частью его имени. На самом деле это строго определено, потому что иногда в Objective-C вам нужно ссылаться на полный селектор метода (используя директиву @selector). См. Раздел Селекторы в документе Язык программирования Objective-C.

Кроме того, заказ является значительным. Эти два метода различны:

- (void)foo:(int)bar baz:(int)qux; // named 'foo:baz:'
- (void)baz:(int)quz foo:(int)bar; // named 'baz:foo:'

В Objective-C нет перегрузок. Компилятор не будет отправлять разные методы с одинаковыми именами, но с разными типами параметров.

Ведущий tableView: в ваших примерах - это просто общее соглашение об именах, используемое для делегатов; все селекторы делегатов будут начинаться с параметра, который указывает объект, который делегирует функциональность.

1 голос
/ 28 октября 2010

В Objective-C имена методов называются сигнатурами , а методы часто называются селекторами .

Подпись четырех селекторов в вашем примере:

numberOfSectionsInTableView:
tableView:numberOfRowsInSection:
tableView:heightForRowAtIndexPath:
tableView:cellForRowAtIndexPath:

cellForRowAtIndexPath:tableView: не совпадает с tableView:cellForRowAtIndexPath:

Не может быть более одного селектора с одинаковой подписью на класс.

0 голосов
/ 28 октября 2010

В Objective-C аргументы перемежаются с именем метода (называемого «селектором»), а не передаются в виде списка в скобках после имени. Полный селектор - это целая длинная вещь (tableView: numberOfRowaInSection :). Селектор разделяется на двоеточия, и именно здесь размещаются аргументы. Есть один аргумент для каждого двоеточия. Селектор без двоеточий означает метод, который не принимает параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...