Пустое имя метода, что это на самом деле?

В настоящее время я изучаю себя objective-c и программирование на iOS и обнаружил, что я застрял с нерабочим кодом из-за этой тонкой ошибки в течение часа. Рассмотрим следующий код:

@property (strong, nonatomic) NSString *name;
- (NSString *):name { return @"Some name"; }

На первый взгляд (и для любого нового) это выглядит как переопределенный getter для свойства name. Но theres очень тонкий :, которого не должно быть. Вы не получаете никаких предупреждений/ошибок от компилятора/парсера/времени выполнения, поэтому мой вопрос заключается в том, что это на самом деле заканчивается как?

Я попытался понять способ вызова этого метода, как только увидел ошибку, но не смог выполнить несколько моих попыток.

Ответ 1

Подпись - (NSString *):name метода сводится к следующему:

  • - Это метод экземпляра (по сравнению с методом класса с +).
  • (NSString *) Он возвращает строку.
  • : Если вы будете говорить имя этого метода, его просто назовут "двоеточие". : сообщает компилятору, что ваш метод также принимает один параметр.
  • name Существует параметр с именем name.

Если вы не укажете тип, компилятор предполагает, что вы имели в виду id, поэтому этот метод фактически имеет значение - (NSString *):(id)hello

Действительным вызовом этого метода будет: [self :@"hello"].

Вы можете делать действительно странные вещи, потому что : является допустимым именем для метода, а компилятор принимает id. Вы могли бы, если бы вы действительно захотели, иметь метод под названием - :::. Компилятор предположил, что вы имели в виду - (id):(id):(id):(id), метод, который возвращает объект типа id и принимает три параметра типа id. Вы бы назвали это так: [self :@"hello" :anObject :myObject];

Ответ 2

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

  • Первый символ: либо -, либо +. - означает, что это метод экземпляра, + означает, что это метод класса.
  • Значение в круглых скобках: тип возвращаемого метода. В вашем примере метод возвращает (NSString *).
  • Остальное (до фигурных скобок) - это имя метода вместе с любыми параметрами, которые они принимают. У вас может быть имя без параметров, и в этом случае имя метода не будет содержать :. Например - (void) reload; Это будет метод, который не возвращает значение и не принимает никаких параметров.
  • Если ваш метод принимает параметры, они будут смешиваться с именем метода и обычно будут объявлять тип (в отличие от вашего примера). Например, - (NSString *) reverseString:(NSString *) stringToReverse; В этом примере имя вашего метода будет reverseString: для этого параметра требуется один параметр, NSString*, который будет называться stringToReverse в определении метода.
  • Обычно, если вы видите : без типа, это будет такой случай, как - (float) addThreeValues:::. Этот метод возвращает float и принимает 3 параметра. Это было бы подходящим определением, потому что три значения не имеют значения, какой порядок они предоставляются, потому что мы просто добавляем их.