不能将SKNode强制转换为SKNode的子类

我从一个函数返回一个SKNode ,我需要把它转换成一个自定义的SKNode 。 我得到错误Cannot assign value of SKNode的Cannot assign value of to type GroundNode。 如果我强制转换,它会编译,但在运行时失败。 我错过了什么?

 // Custom node class class GroundNode: SKNode { weak var entity: GKEntity! } // Return node function func returnNode() -> SKNode { ... return node } // Where I am getting the error func setupNode() { var ground: GroundNode ground = returnNode() // error here. //// ground = returnNode() as! GroundNode fails at runtime. } 

编辑 :我从sks文件得到一个SKNode 。 我的returnNode()只是得到名称的孩子,并将其返回给我的setupNode()函数。 我需要添加实体属性,所以我想将我的返回的SKNode转换为GroundNodetypes。

我已经看到了这个 stackoverflowpost。

这适用于SKSpiteNode ,但显然不与SKNode ,这对我来说没有多大意义。

如果我将SKNode从我的sks文件转换到GroundNode ,它会在运行时崩溃。

根据你的代码:

 // Custom node class class GroundNode: SKNode { weak var entity: GKEntity! = GKEntity() // or some custom initialization... } // Where I am getting the error func setupNode() { var ground: GroundNode ground = returnNode() as? GroundNode } 

发生这种情况是因为returnNode输出是一个通用的SKNode,并且您必须将您的转换显示到子类GroundNode。

编辑 :好的,与您的更新,我想我已经明白你的问题,你忘了为你的GroundNode设置自定义类:

在这里输入图像说明

第一

returnNode()返回SKNode类的一个实例。 它也可能返回一个派生类的实例(例如GroundNode ),但是调用站点并不知道函数声明。 你试图把这个实例赋值给SKNode子类的variables – GroundNode ,这在OOP中不合适的

请参阅dynamic绑定 OOP概念:

在面向对象的编程语言中,超types的variables可以包含子类实例。

(可能有人可以更详细地解释这一点,但这是事情对我来说的样子)

第二

types铸造 。 当你怀疑一个类types的某个variables可能持有一个派生类的实例时,你可以进行types转换来certificate这一点。

returnNode()返回SKNode 任何派生类的实例,但调用站点只想处理派生类( GroundNode )的实例,因此应使用types转换技术之一。

 import GameplayKit import SpriteKit // Custom node class class GroundNode: SKNode { var entity: GKEntity = GKEntity() } // Return node function func returnNode() -> SKNode { // let's assume that you are correctly getting an instance // of GroundNode class here, and return it from the function // as of SKNode type let returnNode: SKNode = GroundNode() return returnNode } func setupNode() { var groundNode: GroundNode? // Type Casting // Approach #1 let someNode = returnNode() if someNode is GroundNode { groundNode = someNode as! GroundNode } // Approach #2 groundNode = returnNode() as? GroundNode print("groundNode = \(groundNode)") } 

我认为应该是

func returnNode() -> GroundNode {