Точечная запись - принимает ли она параметры?

Правильно ли я скажу, что

[anIstance aMethod];

эквивалентно

anIstance.aMethod; --?

Если это так, как насчет методов, которые принимают один или несколько параметров?

Следующее утверждение

[anIstance aMethod : aParameter];

имеют эквивалентную запись через точку?

я пробовал с

anIstance.aMethod : aParameter;

anIstance.aMethod(aParameter);

И они, похоже, не работают (ошибки времени компиляции)

Если нет способа вызвать метод с параметрами в точечной нотации, как насчет синтезированных методов установки (которые, насколько мне известно, по определению принимают аргумент)?

Если у меня есть синтезированное свойство, следующий оператор

anIstance.aProperty = anotherObject;

вызвать относительный метод установки? Или он вызывает метод получения?


person user236739    schedule 19.01.2010    source источник


Ответы (4)


Другие ответы передают общую идею, но я хотел бы прямо указать, что точечная нотация и свойства — это разные понятия. Точечная нотация предназначена для сеттеров (методов с именем setSomething:, которые принимают один параметр) и геттеров, а также может использоваться для любого метода, который не принимает параметров (хотя это очень плохой стиль, чтобы использовать его для действия как 2_).

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

Таким образом, эти две концепции связаны, но полностью возможно (и не всегда в плохом стиле) использовать точечную запись с вашими собственными геттерами и сеттерами, которые вы написали вручную. Также вполне возможно (и обычно вполне приемлемо!) использовать свойства, даже с сгенерированными для вас геттерами и сеттерами, с обычным синтаксисом скобок, а не с точечной записью.

Но чтобы ответить на исходный вопрос, нет, точечная запись не принимает параметров. Он специально разработан для использования с методами, которые не принимают параметры.

person andyvn22    schedule 20.01.2010
comment
Спасибо. После других ответов у меня возникла мысль, что я совершенно не в теме, и я очень рад видеть, что, возможно, это было не так. Очень полезно. - person user236739; 01.02.2010

Это описано в статье Apple «Программирование на языке C. Руководство по языку":

@interface MyClass : NSObject
{
    float value;
}
@property float value;
@end

Вы можете представить объявление свойства эквивалентным объявлению двух методов доступа. Таким образом

@property float value;

эквивалентно:

- (float)value;
- (void)setValue:(float)newValue;
person Stephen Darlington    schedule 19.01.2010

точечная нотация действительна только для свойств. Свойства объявляются с помощью объявления @property в Objective-C.

нравится:

interface MyClass {
   NSString * x;
}

@property (copy) NSString *x;

выполнение:

@synthesize x;

// this will generate a setter and getter method:
// - (NSString *) x {}
// - (void) setX:(NSString *)value {}

то вы можете использовать:

MyClass *obj = [[MyClass alloc] init];

obj.x = @"test";

Но это работает только для свойств. Не для методов.

person Philippe Leybaert    schedule 19.01.2010
comment
На самом деле, вы можете использовать его для всего, что соответствует соглашениям об именах методов свойств, но на самом деле это не то, для чего он предназначен. - person Quinn Taylor; 19.01.2010

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

person lepoetemaudit    schedule 19.01.2010
comment
Неправильно; не только для свойств. Точечная нотация может использоваться для любого сообщения с одним параметром. - person AndrewS; 16.08.2013