Я всегда вижу, как люди спорят о том, использовать ли установщик свойства в методе -init
. Моя проблема заключается в том, как создать значение по умолчанию в подклассе для унаследованного свойства. Скажем, у нас есть класс с именем NSLawyer
— класс фреймворка, который я не могу изменить — с интерфейсом, который выглядит так:
@interface NSLawyer : NSObject {
@private
NSUInteger _numberOfClients;
}
@property (nonatomic, assign) NSUInteger numberOfClients;
@end
И реализация, которая выглядит так:
@implementation NSLawyer
- (instancetype)init
{
self = [super init];
if (self) {
_numberOfClients = 0;
}
return self;
}
@end
Теперь предположим, что я хочу расширить NSLawyer
. Мой подкласс будет называться SeniorPartner
. А поскольку у старшего партнера должно быть много клиентов, при инициализации SeniorPartner
я не хочу, чтобы экземпляр начинался с 0
; Я хочу, чтобы у него было 10
. Вот SeniorPartner.m:
@implementation SeniorPartner
- (instancetype)init
{
self = [super init];
if (self) {
// Attempting to set the ivar directly will result in the compiler saying,
// "Instance variable _numberOfClients is private."
// _numberOfClients = 10; <- Can't do this.
// Thus, the only way to set it is with the mutator:
self.numberOfClients = 10;
// Or: [self setNumberOfClients:10];
}
return self;
}
@end
Так что же делать новичку в Objective-C? Ну, я имею в виду, есть только одна вещь, которую я могу сделать, это установить свойство. Если я что-то упускаю. Любые идеи, предложения, советы или хитрости?
@private
на@protected
- person Kevin DiTraglia   schedule 30.05.2014NSButton
илиNSPathControl
, и, поскольку наши хорошие друзья в Apple любят смотреть, как мне больно, все их классы имеют свои ивары в своих заголовочных файлах (почти как издевательство надо мной), но я не могу их трогать. . :-( А как насчет тех ситуаций? - person Ben Stock   schedule 30.05.2014self->numberOfFriends
? - person stevesliva   schedule 30.05.2014init
возвращаютself
? - person jlehr   schedule 30.05.2014