Что означает этот синтаксис в Objective-C? - PullRequest
4 голосов
/ 28 января 2010

Рассмотрим следующее:

- (id)initWithTitle:(NSString *)newTitle
     boxOfficeGross:(NSNumber *)newBoxOfficeGross
            summary:(NSString *)newSummary;

Что это значит? Я догадался, что он возвращает id и принимает три параметра, но что означает каждая часть синтаксиса? Я родом из Ruby / JS, и мне сложно понять этот синтаксис.

Ответы [ 3 ]

5 голосов
/ 28 января 2010

Это метод экземпляра (т. Е. Не статический или «классовый» метод) с именем initWithTitle:boxOfficeGross:summary:, который возвращает объект типа id (универсальный объект). Он принимает три параметра: объект String, объект Number и другой объект String.

Вы вызываете это так:

NSNumber * gross = [NSNumber numberWithInteger:1878025999]
Movie * avatar = [[Movie alloc] initWithTitle:@"Avatar"
                               boxOfficeGross:gross
                                      summary:@"Pocahontas in the 22nd century"];
//or you can do it all on one line, like so:
Movie * avatar = [[Movie alloc] initWithTitle:@"Avatar" boxOfficeGross:gross summary:@"Pocahontas in the 22nd century"];
4 голосов
/ 28 января 2010
  • - означает, что метод является методом экземпляра , а не методом класса .
  • (id) означает, что он возвращает id, как вы и предполагали.
  • initWithTitle:, boxOfficeGross: и summary: являются частью имени метода. В Objective-C каждый параметр обычно имеет связанную часть имени метода. Полное название метода: initWithTitle:boxOfficeGross:summary.
  • (NSString *) и т. Д. Обозначают тип параметра.
  • newTitle и т. Д., Это имя параметра.
0 голосов
/ 28 января 2010

- обозначает метод экземпляра, тогда как если бы это был +, это был бы метод класса.

(id) - это то, что возвращает метод, это просто ссылка на объект.

Остальная часть строки показывает параметры. При вызове функции вы записываете часть каждого параметра перед :, например, [class initWithTitle:@"my title"];

Причина, по которой существует два имени для каждого параметра, заключается в том, что сам метод будет ссылаться на переменную независимо от того, что находится после :, поэтому заголовок будет newTitle.

Поначалу это меня смущало, но в этом есть свои преимущества.

Кроме того, части каждого параметра в круглых скобках являются типом объекта параметра. (NSString *) является указателем на NSString. Если бы вы пропустили что-то, что не было NSObject, например, NSIntger, вам бы не понадобилось *. Вы бы просто сделали: -(id)initWithInteger:(NSIntger)newInteger;

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