我需要在超类中强制初始化 ivar,但是如果没有要初始化的子类中的其他数据,通常无法初始化 ivar。我想到的两个解决方案是:
- 将 ivar 所需的生成密钥传递给超类的 init 方法
- 从子类的 init 方法调用第二个超类方法
这是示例(人为的,非工作的)代码。stringBasedOnSubclassKey ivar 应该从子类的 key 方法初始化为 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。这些子类也可能由其他外部开发人员创建,因此关键方法可能比这更复杂。
更新:我正在处理这个基类的现有子类,因此限制对现有子类的更改的解决方案是一个因素。