我从一个函数返回一个SKNode,我需要将它转换为一个自定义SKNode。我得到了错误Cannot assign value ofSKNodeto typeGroundNode.如果强制强制转换,它会编译,但在运行时失败。我遗漏了什么?
// 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()函数。我需要添加entity属性,因此我希望将返回的SKNode转换为GroundNode类型。
我见过这堆叠溢出的帖子。
这适用于SKSpiteNode,但显然不适用于SKNode,这对我来说没有多大意义。
如果我将sks文件中的SKNode转换为GroundNode,它会在运行时崩溃。
发布于 2016-05-26 12:13:44
根据您的代码:
// 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设置自定义类了:

发布于 2016-05-26 12:39:00
第一
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)")
}发布于 2016-05-26 12:13:15
我觉得应该是
func returnNode() -> GroundNode {
https://stackoverflow.com/questions/37460222
复制相似问题