繁体   English   中英

无法将SKNode强制转换为SKNode的子类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM