首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能将SKNode转换为SKNode的子类

不能将SKNode转换为SKNode的子类
EN

Stack Overflow用户
提问于 2016-05-26 11:57:54
回答 3查看 577关注 0票数 1

我从一个函数返回一个SKNode,我需要将它转换为一个自定义SKNode。我得到了错误Cannot assign value ofSKNodeto typeGroundNode.如果强制强制转换,它会编译,但在运行时失败。我遗漏了什么?

代码语言:javascript
复制
// 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,它会在运行时崩溃。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-26 12:13:44

根据您的代码:

代码语言:javascript
复制
// 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设置自定义类了:

票数 1
EN

Stack Overflow用户

发布于 2016-05-26 12:39:00

第一

returnNode()返回SKNode类的一个实例。它还可能返回派生类的实例(例如GroundNode),但是调用站点不知道从函数声明中得到的结果。您正在尝试将此实例分配给SKNode的子类- GroundNode的变量,这在OOP中是不合适的

请参阅动态绑定 OOP的概念:

在面向对象的编程语言中,超类类型的变量可以包含子类实例.

(也许,其他人可以更详细地解释这一点,但在我看来,情况就是这样)

第二

型铸造。当您怀疑类类型的某个变量可能包含派生类的实例时,可以执行类型转换以证明这一点。

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

代码语言:javascript
复制
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)")
}
票数 1
EN

Stack Overflow用户

发布于 2016-05-26 12:13:15

我觉得应该是

func returnNode() -> GroundNode {

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37460222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档