我需要在超类中强制执行ivar的初始化,但是如果没有要初始化的子类中的其他数据,则通常无法初始化ivar。我想到的两个解决方案是:
以下是示例(人为的,非工作的)代码。应该从子类的键方法将stringBasedOnSubclassKey ivar初始化为NSString。
@interface MySuperclass : NSObject
@property (nonatomic, readonly) NSString *stringBasedOnSubclassKey;
@end
@interface MySubclass : MySuperclass
@property (nonatomic, assign, readonly) int value;
@end
@implementation MySubclass
- (instancetype)init
{
if (self = [super init]) {
_value = 30;
}
return self;
}
- (NSString *)key
{
return [NSString stringWithFormat:@"UniqueKey-%d", self.value];
}
所以问题是有没有办法使用“key”方法的返回值强制执行stringBasedOnSubclassKey ivar的初始化?我不相信我可以执行上面的解决方案1和2。这些子类也可能由其他外部开发人员创建,因此关键方法可能比这更复杂。
更新:我正在处理这个基类的现有子类,因此限制对现有子类的更改的解决方案是一个因素。
答案 0 :(得分:1)
以强制初始化的方式编写stringBasedOnSubclassKey
的getter:
- (NSString *) stringBasedOnSubclassKey {
if !(_stringBasedOnSubclassKey) {
_stringBasedOnSubclassKey = // whatever;
}
return _stringBasedOnSubclassKey;
}
编写超类key
方法以抛出异常,从而强制客户端在子类中覆盖它。