Могу ли я создать свойства с общедоступным и частным установщиком? - PullRequest
14 голосов
/ 06 мая 2009

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

foo.h:

@interface Foo {
  NSString *bar;
}
@property (readonly) NSString *bar;
@end

Foo.m:

#import "Foo.h"

@interface Foo ()
@property (copy) NSString *bar;
@end

@implementation Foo
@synthesize bar;
@end

Но это выдает предупреждение:

Foo.m:4: warning: property ‘bar’ attribute in ‘Foo’ class continuation does not match class ‘Foo’ property

Я вижу, на что это жалуется, но это все еще кажется полезной идиомой. Есть ли другой способ сделать это без написания моих собственных сеттеров?

Ответы [ 2 ]

31 голосов
/ 06 мая 2009

Ваш подход правильный, но переопределение @property bar в расширении класса должно соответствовать исходному объявлению, за исключением чтения-записи и чтения-только. Так что это будет работать:

foo.h

@interface Foo {
  NSString *bar;
}
@property (copy,readonly) NSString *bar;
@end

Foo.m:

#import "Foo.h"

@interface Foo ()
@property (copy,readwrite) NSString *bar;
@end

@implementation Foo
@synthesize bar;
@end

(напомним, что по умолчанию assign для свойств, а не copy).

3 голосов
/ 05 декабря 2009

Когда Барри говорит, что «по умолчанию сохраняется для свойств», он означает, что сохранение должно быть указано следующим образом:

@property (retain) NSDate *endDate;

Если их оставить так:

@property NSDate *endDate;

присвоение предполагается компилятором.

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