2015-04-17 117 views
0

考虑以下代码:无法识别的选择器发送到实例错误?

SCNNode *someNode = [[SCNNode alloc] init]; 
Piece *piece = (Piece *)someNode; 
[piece pick]; 

如果片的子类SCNNode和含有一种称为选秀权。 Xcode返回此错误:

[SCNNode pick]: unrecognized selector sent to instance 

有人可以告诉我的代码有什么问题吗?

编辑:

我想这一点。同样的问题。

- (id)initPieceWithNode:(SCNNode *)node { 

    if (self = [super init]) { 
     self = (Piece *)[node copy]; 
    } 

return self; 
} 
+4

'someNode'不是'Piece'对象,它是'SCNNode'对象。你不能简单地将一个基类实例转换成一个子类实例,并期望它能够工作。 – rmaddy

+0

@rmaddy,但其返回的'pick'不是'SCNNode'的方法,而OP已经在'SCNNode'中定义了它。 –

+1

@BurhanuddinSunelwala不,'pick'是'Piece',而不是'SCNNode'的方法。 – rmaddy

回答

1

在这里,您将一个SCNNode转换为一个片段,而不是创建一个片段对象。如果转换,该方法将不会在神奇的SCNNode中出现。

你应该这样做:

Piece *piece = [Piece pieceWithNode:someNode]; 

而且为例:

+ (Piece *)pieceWithNode:(SCNNode *)aNode { 
    Piece *newPiece = [Piece new]; 

    newPiece.property1 = aNode.propertyX 
    newPiece.property2 = aNode.propertyY 
    ... 

    return newPiece; 
} 

这是做到这一点的最好办法。

编辑2: 根据意见:

Piece *piece = [Piece new]; 
[piece pick]; 

这是enougth

+0

感谢您的回答。你能告诉我那pieceWithNode方法是怎么样的吗?我是Objective-C的绝对初学者:) –

+0

何我不知道,我正在给你你应该这样做的方式。我不知道SCNNode和Piece类,所以我不能告诉你方法名是否正确。是一个解释你应该怎么做。 –

+0

我自己编写了Piece类,而SCNNode是Apple的Scene Kit节点类。 Piece是SCNNode的一个子类。无论如何,谢谢你的答案。我试图让它起作用,如果是这样,我会标记你的答案是正确的。 –

1

如果PieceSCNNode一个子类,然后

Piece *piece = [[Piece alloc] init]; 
    [piece pick]; 
+0

这就是我正在做的。请再次阅读该问题。 –

+0

复制/粘贴错误。修改我的答案。 – mnuages

0

如果你正在处理一个多态键入那么你应该查询对象的确切类型并对该对象执行适合该类型的操作。

例如您有:

@interface SCNNode : NSObject 
- (void)baseMethod; 
@end 

@interface Piece : SCNNode 
- (void)derivedMethod; 
@end 

然后处理代码的行为应该是这样的:

- (void)doSomethingWithNode:(SCNNode *)node 
{ 
    [node baseMethod]; 
    if ([node isKindOfClass:[Piece class]]) { 
     [node derivedMethod]; 
    } 
} 

这是不恰当的处理代码为基本类型转换为派生类型因为我怀疑它能够提供对象的附加属性。如果你正在转换,那么其他地方有什么不对。

相关问题