Точечная запись - принимает ли она параметры? - PullRequest
2 голосов
/ 19 января 2010

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

[anIstance aMethod];

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

anIstance.aMethod; --?

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

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

[anIstance aMethod : aParameter];

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

Я пытался с

anIstance.aMethod : aParameter;

anIstance.aMethod(aParameter);

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

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

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

anIstance.aProperty = anotherObject;

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

Ответы [ 4 ]

3 голосов
/ 20 января 2010

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

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

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

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

3 голосов
/ 19 января 2010

Это описано в руководстве Apple по The Objective C Language :

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

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

@property float value;

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

- (float)value;
- (void)setValue:(float)newValue;
0 голосов
/ 19 января 2010

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

0 голосов
/ 19 января 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";

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

...