考虑一下这个构造函数的例子:
+ (instancetype)widgetWithTitle:(NSString *)title
{
Widget* widget = [[self alloc] init];
widget.title = title;
return widget;
}
假设我想动态推断类型,因此当使用此构造函数调用子类时,它们将返回WidgetSubclass*
而不是Widget*
。
我期望typeOf(self) widget = [[self alloc] init]
抛出编译器警告。那么我怎么能要求编译器创建指向所调用的任何类型的指针,而不是这个硬编码的超类类型呢?
请注意,我意识到我可以制作initWithTitle:
方法并返回[[self alloc] initWithTitle:title]
,这不是重点。
另请注意,我意识到这实际上并不会妨碍子类中的任何操作设置 - 这只是为了理想。
- 编辑 -
我应该澄清我的意图,因为这个问题没有受到热烈欢迎。目标只是看看是否有一个编译时typeOf
机制,我可以用它来声明我当前上下文类型的对象(编译时等效于[self class]
)。想想instancetype objectOfMyOwnKind = ...
或typeOf(self) anObjectLikeMe = [self copy]
或其他什么。
这不是必然的实际应用。纯粹是一种好奇心。毫无疑问如何实现一个合适的构造函数,如果构造函数是一个红色的鲱鱼,我道歉。
答案 0 :(得分:0)
...我想动态地推断出类型,所以当使用这个构造函数调用我的子类时,它们会返回
WidgetSubclass*
而不是Widget*
。
他们已经这样做了,因为这就是instancetype
的意思:返回一个消息类的实例。
没有必要“动态输入”这个变量。*为什么?
没有必要,因为超类(定义此方法)不应该具有其子类的特定知识。键入指针以引用子类的唯一原因是使用特定于子类的方法。这是 - 充其量 - 一个可怕的想法。
由于没有必要,没有办法做你所要求的。
超类是此变量的有效且正确的类型。如果您想要更通用的类型,则必须使用id
。
*或指向当前类实例的任何其他变量(在超类的方法中)。
答案 1 :(得分:-1)
无论是谁投票,都应该考虑他们是否真正了解所要求的内容。
这可能适合你:
BaseClass *instance;
instance = [[self class] new];
instance.title = @"...";