@interface ViewController : UIViewController{
NSNumber *nmbr;
}
@property (nonatomic, readonly) NSNumber *nmbr;
- (NSNumber*)nmbr;
- (void)setNmbr:(NSNumber *)value;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setNmbr:[NSNumber numberWithInt:4]];
NSLog(@"Value of number is: %@", self.nmbr);
}
- (NSNumber*)nmbr{
return nmbr;
}
- (void)setNmbr:(NSNumber *)value{
nmbr = value;
}
@end
Я ожидаю программу, чтобы не позволить setNmbr работы функции, потому что NMBR свойства в файле интерфейс только для чтения. Но он устанавливает значение nmbr. Что я делаю неправильно?почему только для чтения сеттер свойства работают Objective C
На самом деле, нет ничего необычного в том, чтобы реализовать сеттер для свойства readonly, но он обычно как-то закрыт. (Предоставление свойства readonly не позволит вам назначить свойство * * - вызовы setter должны быть явными.) –
Да, но если вы это сделаете, наилучшая практика предложит переопределить квалификатор 'readonly' в расширении частного класса , Таким образом, открытый интерфейс будет 'readonly', но объявление' @ property' в частном '@ interface' будет' readwrite'. (Опять же, как и мой главный ответ, вам не нужно это делать, но это лучшая практика, ИМХО.) И, кстати, если вы это сделаете, вам не нужно вручную внедрять сеттер (если, конечно, вы делаете что-то особенное, что действительно требует этого), но частный интерфейс 'readwrite' заставит его синтезировать для вас. – Rob