我需要在父类(super class)中强制初始化 ivar,但如果没有初始化子类中的其他数据,通常无法初始化 ivar。我想到的两种解决方案是:
- 将 ivar 所需的生成 key 传递给父类(super class)的 init 方法
- 从子类的 init 方法调用第二个父类(super class)方法
这是示例(人为的、不起作用的)代码。 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。这些子类也可能是由其他外部开发人员创建的,因此关键方法可能比这更复杂。
更新:我正在处理该基类的现有子类,因此限制对现有子类的更改的解决方案是一个因素。
最佳答案
以强制初始化stringBasedOnSubclassKey
的方式编写getter:
- (NSString *) stringBasedOnSubclassKey {
if !(_stringBasedOnSubclassKey) {
_stringBasedOnSubclassKey = // whatever;
}
return _stringBasedOnSubclassKey;
}
并编写父类(super class)key
方法来抛出异常,从而强制客户端在子类中重写它。
关于objective-c - 调用父类(super class)的 init 方法后强制初始化父类(super class)的 ivar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375508/