Свойство Objective-C, которое открыто только для чтения, но имеет частный сеттер


Я хотел бы использовать @property синтаксис для объявления синтезированного свойства, которое открыто только для чтения, но имеет сеттер, который может быть вызван в частном порядке из класса.

поскольку это Objective-C, это в основном означает, что setFoo: метод будет синтезирован, но вызов его вне самого класса приведет к предупреждению (нераспознанный селектор). Чтобы вызвать предупреждение, я должен объявить свойство readonly; есть ли способ заставить синтезированный сеттер, который является доступно только в классе?

2 60

2 ответа:

Я думаю, что то, что вы ищете, называется расширением класса. Вы объявите свойство только для чтения в заголовке:

@interface MyClass : NSObject {
}

@property (readonly, assign) NSInteger myInteger;

@end

затем повторно объявите расширение класса в файле реализации:

@interface MyClass ()

@property (readwrite, assign) NSInteger myInteger;

@end


@implementation MyClass

@end

для получения дополнительной информации проверьте Apple документация

я мог бы опоздать, но без расширения я сделал, используя следующую технику

@interface MyClass : NSObject {
 NSString * name;
}

@property (readonly, strong) NSString * name;

@end

С другой стороны в реализации файлом

@implementation MyClass
 @synthesize name;

 - (id)initWithItems:(NSDictionary *)items {
self = [super init];
if(self)
{ 
  name = @"abc";
}

return self;
}

@end

при этом он установит ваше значение и будет доступен только для чтения. Спасибо.