考虑以下代码:
SCNNode *someNode = [[SCNNode alloc] init];
Piece *piece = (Piece *)someNode;
[piece pick];
其中Piece是SCNNode的子类,并包含一个名为pick的方法。 Xcode返回此错误:
[SCNNode pick]: unrecognized selector sent to instance
有人能告诉我的代码有什么问题吗?
修改
我也试过这个。同样的问题。
- (id)initPieceWithNode:(SCNNode *)node {
if (self = [super init]) {
self = (Piece *)[node copy];
}
return self;
}
答案 0 :(得分:1)
在这里,您将SCNNode转换为Piece,而不是创建Piece对象。如果转换,该方法将不会神奇地出现在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];
这是完全的
答案 1 :(得分:1)
如果Piece
是SCNNode
的子类,那么
Piece *piece = [[Piece alloc] init];
[piece pick];
答案 2 :(得分: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];
}
}
处理代码将基类型转换为派生类型是不合适的,因为我怀疑它是否能够提供对象的附加属性。如果你正在转换,那么别的地方出了问题。