[英]Cannot cast SKNode to subclass of SKNode
我要从一个函数返回一个SKNode
,我需要将其SKNode
转换为自定义SKNode
。 我收到错误消息: Cannot assign value of
SKNode的Cannot assign value of
GroundNode to type
。 如果我强制转换,它将编译,但在运行时会失败。 我想念什么?
// 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
转换为GroundNode
类型。
我看过这个 stackoverflow帖子。
这适用于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
的子类GroundNode
的变量,该变量在OOP中不合适 。
请参阅动态绑定 OOP概念:
在面向对象的编程语言中,超类类型的变量可以包含子类实例。
(也许其他人可以更详细地解释这一点,但这就是我的看法)
类型转换 。 当您怀疑某个类类型的变量可能包含派生类的实例时,可以进行类型转换以证明这一点。
returnNode()
返回一个SKNode
或任何派生类的实例,但是调用站点只想处理派生类的实例( GroundNode
),因此应使用一种类型转换技术。
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 {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.