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

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

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

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

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

10 голосов | спросил Nervetattoo 28 AMpSat, 28 Apr 2012 02:38:26 +040038Saturday 2012, 02:38:26

2 ответа


0

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

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

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

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

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

ответил Jack Lawrence 28 AMpSat, 28 Apr 2012 02:45:44 +040045Saturday 2012, 02:45:44
0

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

  1. Первый символ: либо -, либо +. - означает, что это метод экземпляра, + означает, что это метод класса.
  2. Значение в скобках: тип возвращаемого значения метода. В вашем примере метод возвращает (NSString *).
  3. Остальное (до фигурных скобок) - это имя метода вместе с любыми параметрами, которые они принимают. У вас может быть имя без параметров, и в этом случае имя метода не будет содержать :. Например, - (void) reload; Это будет метод, который не возвращает значение и не принимает параметров.
  4. Если ваш метод принимает параметры, они будут смешаны с именем метода и обычно будут объявлять тип (в отличие от вашего примера). Например, - (NSString *) reverseString:(NSString *) stringToReverse; В этом примере имя вашего метода будет reverseString: он принимает один параметр - NSString*, который будет называться stringToReverse в определении метода.
  5. Обычно, если вы видите : без типа, это будет случай как - (float) addThreeValues::: Этот метод возвращает число с плавающей запятой и принимает 3 параметра. Это было бы подходящим определением, потому что три значения не имеют значения, в каком порядке они предоставляются, потому что мы просто добавляем их.
ответил Mike Z 28 AMpSat, 28 Apr 2012 02:57:13 +040057Saturday 2012, 02:57:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132