[SKNode节点]返回初始化节点。 ( https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKNode_Ref/Reference/Reference.html#//apple_ref/occ/clm/SKNode/node)
如果我是SKNode的子类:
@interface MyClass:SKNode
然后在MyClass中指定的初始化程序中,我调用超级指定的初始化程序(类方法)。
@implementation MyClass
{
MyScene _MyScene;
}
- (instancetype)initWithScene:(MyScene *)myScene
{
_MyScene = myScene;
if (self = [SKNode node]) { // HERE I GET ERROR
}
return self;
}
错误:将赋值结果用作不带括号的条件 如果我把它改为:
if ((self = [SKNode node]))
我得到:从(SKNode *)分配给(MyClass *)的不兼容指针类型 如果是一个类方法,调用超级指定初始值设定项的方法是什么?我也试过了 调用self =(MyClass *)[SKNode节点],但我得到一个奇怪的错误。
答案 0 :(得分:1)
我得到:从(SKNode *)分配给(MyClass *)的不兼容指针类型
问题是[SKNode node]
在SKNode
的实例中分配和初始化,这意味着您没有机会将该对象转换为您自己的子类的实例。您收到了不兼容的指针错误,因为您正在尝试将SKNode *
分配给self
MyClass *
。
相反,您需要自己进行分配,以便在超类初始化之后为实例变量留下足够的空间。所以,做一些像:
self = [super init];
if (self) {
//...
}
我也试过调用self =(MyClass *)[SKNode节点]但是我得到了一个奇怪的错误。
这基本上是同一个问题。将[SKNode node]
投射到MyClass *
类型并不会改变对象本身是SKNode
的实例,而不是MyClass
的实例的事实。同样,您需要创建MyClass
的实例(使用+alloc
),然后调用超类的(SKNode
)初始化程序,然后然后执行MyClass
初始化。
答案 1 :(得分:0)
将此行更改为:
if (self = [super init]) {
...
您不想创建一个SKNode对象,而是通过调用:[SKNode node]
来尝试这样做。