如何从 SKNode.children 数组访问 SKNode 子类方法?

Posted

技术标签:

【中文标题】如何从 SKNode.children 数组访问 SKNode 子类方法?【英文标题】:How do you access SKNode subclass methods from SKNode.children array? 【发布时间】:2019-05-10 12:07:13 【问题描述】:

我有一个场景,其中包含许多子类 SKNode。我正在尝试访问每个子节点的方法,但收到错误“'SKNode' 类型的值没有成员'[成员名称]”。

Xcode 10.2 上的所有 Swift 5(如果相关?)。

import SpriteKit

class GameScene: SKScene 

    override func didMove(to view: SKView) 

        let slim = NamedNode(name: "Slim Shady")
        let snoop = NamedNode(name: "Snoop Dog")
        let shaggy = NamedNode(name: "Shaggy")

        self.addChild(slim)
        self.addChild(snoop)
        self.addChild(shaggy)

        for child in self.children 
            child.whatsMyName()   
            // ERROR: Value of type 'SKNode' has no member 'whatsMyName'
        
    



class NamedNode: SKNode 

    var standup = false

    init(name: String) 
        super.init()
        self.name = name
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    func whatsMyName() 
        print("My name is ", name as Any)
        if self.name == "Slim Shady" 
            standup = true
        
    

如何从 Scene.children 数组中访问这些方法?有可能还是我应该改变机智?

谢谢!

【问题讨论】:

你怎么确定所有场景的孩子都是NamedNodes?这会永远是真的吗? 【参考方案1】:

It is said here that

SKScene 的子节点属于 SKNode 类型。您想要访问 SKNode 子类的属性。在编译时,子节点被视为 SKNode。 你应该尝试给你的孩子施放,比如

对于self.children中的孩子 (child as?NamedNode).whatsMyName()

请记住,向下转换通常是一种代码味道。

【讨论】:

这与这样的额外问号一起使用:for child in self.children (child as? NamedNode)?.whatsMyName() so 标记为已回答。您和@Sweeper 提出了关于不确定子节点是否实际上是 NamedNode 的观点,将来会尽量避免 代码气味。 (顺便说一句很棒的词) 您认为实现这一点的更好方法是什么?我的一个想法是将方法保留在父场景中,并让子节点只保存基本节点数据(名称等)。

以上是关于如何从 SKNode.children 数组访问 SKNode 子类方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个函数访问布尔数组? C++

如何从会话中访问 JavaBeans 数组

如何从类变量数组中访问类成员?

如果创建父类的数组,如何通过数组对象从子类访问方法?

如何直接访问从 VBScript 中的函数返回的数组

如何从 NSStrings 数组中填充选择器视图?然后我将如何访问所选择项目的价值?