Пустое имя метода, что это на самом деле?
В настоящее время я изучаю себя 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 параметра. Это было бы подходящим определением, потому что три значения не имеют значения, какой порядок они предоставляются, потому что мы просто добавляем их.