метод, принимающий разные аргументы в точечной нотации - PullRequest
2 голосов
/ 07 февраля 2010

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

- (void) setTo: (int) n over: (int) d
{ .... }

чтобы использовать его, он показывает:

[myFraction setTo: 100 over:200];

как будет выглядеть эта скобка в точечной нотации? Энди не понимаю, что это за значит, кто-нибудь знает? Thnx

Ответы [ 5 ]

2 голосов
/ 07 февраля 2010

Точечная запись является сокращенной записью только для доступа к свойству . Компилятор переводит его в соответствующий вызов метода set / getter. Это просто синтаксический сахар.

Таким образом, при доступе к этому свойству с использованием точечной нотации:

myFraction.numerator=100;

Компилятор заменяет его следующим эквивалентным кодом:

[myFraction setNumerator:100]

Теперь должно быть понятно, почему нельзя использовать точечную нотацию для отправки обычного сообщения объекту. Я даже не могу придумать, как это должно выглядеть.

Существует много дискуссий по поводу обозначения точка или скобка. Одним из аргументов против точечной нотации является путаница, которую она порождает, особенно для начинающих. Конечно, другие языки также используют методы для методов доступа к свойствам, однако они скрывают этот факт более последовательно, чем Objective-C.

1 голос
/ 07 февраля 2010

Вы не можете передать несколько аргументов с точечными обозначениями. Сеттер, используемый в точечной нотации, должен иметь прототип

-(void)setXxxx:(type)value;

Однако вы можете создать вспомогательную структуру для группировки всех аргументов в один:

struct Fraction { int n, d; };
struct Fraction MakeFraction(int n, int d) {
   struct Fraction r;
   r.n = n;
   r.d = d;
   return r;
}
...
-(void)setValue:(struct Fraction)f { ... }
...
myFraction.value = MakeFraction(100, 200);

a"сверх" b означает a / b .)

0 голосов
/ 30 июля 2012
[myFraction numerator]

Может быть записано как

myFraction.numerator

но вы также можете назначить такие значения, как

instance.property = value

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

0 голосов
/ 07 февраля 2010

В Objective-C мы можем называть методы с аргументами в middle .Поэтому, когда он пишет [myFraction setTo:100 over:200];, over может означать ... ну, все, что он хочет.Это часть имени метода, который он выбрал.В этом случае он, вероятно, пытался заставить метод звучать как английский.(«Установите эту дробь на 100 над 200. Мы читаем дроби как« числитель над знаменателем », часто в обычной речи.)

Некоторые методы, называемые« аксессорами »«Мы пишем очень часто: это методы вида - (int)variable (называемые« getters ») и - (void)setVariable:(int)newValue (называемые« setters »).Мои примеры здесь предположительно вернут или изменят, соответственно, переменную экземпляра с именем variable.Вот как могут выглядеть реализации метода:

- (int)variable
{
    return variable;
}

- (void)setVariable:(int)newValue
{
    variable = newValue;
}

Обычно такие методы доступа есть почти для каждой переменной экземпляра, имеющейся в вашем классе.В какой-то момент кому-то надоело писать [myInstance setVariable:20]; и тому подобное, и он решил, что лучше бы он выглядел, как и многие другие языки, myInstance.variable = 20;.

Поэтому в Objective-C 2.0 добавлена ​​точечная нотация,который позволяет вам написать ...

myInstance.variable, что в большинстве случаев точно соответствует [myInstance variable] (и НЕ имеет прямого доступа к переменной экземпляра variable!), и ...

особый случай myInstance.variable = 20;, который в точности эквивалентен [myInstance setVariable:20];.Опять же, обратите внимание, что это не дает доступа к variable напрямую, оно отправляет сообщение myInstanceПоэтому, если бы мы написали какой-то другой код в setVariable, он все равно был бы доступен, если бы мы использовали точечную нотацию.

Точечная нотация предназначена для использования с аксессорами. Вы также можетеТеоретически используйте его для любого метода, который возвращает значение и не принимает аргументов (например, myArray.count).Использование его для всего остального (myInstance.doSomeAction) - крайне плохой стиль.Не делай этого.Поэтому, как я уверен, вы уже можете догадаться, [myFraction setTo:100 over:200] не имеет эквивалента точечной нотации, так как принимает 2 аргумента и не является аксессором.

0 голосов
/ 07 февраля 2010

Судя по всему, этот метод устанавливает две переменные / свойства экземпляра объекта - числитель (n) и знаменатель (d). Вы не можете сделать это, используя точечную нотацию, если не разбиваете ее на два вызова:

myFraction.numerator=100;
myFraction.denominator=200;

Обратите внимание, что точечная нотация предназначена только для доступа к переменным / свойствам экземпляра и не является альтернативой отправке сообщений.

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