【问题标题】:Calling a parent's function in Swift在 Swift 中调用父函数
【发布时间】:2014-07-30 18:10:52
【问题描述】:

在 Swift 中,我试图在节点的父节点上调用一个函数,如下所示:

self.parent.unhighlightAllCheckers()

没用。我认为这是因为子节点可能不会隐式知道父节点是什么类型的对象,所以我尝试了显式转换:

let myParent: Gameboard = Gameboard(self.parent)
myParent.unhighlightAllCheckers()

也不行。我认为这应该简单得多。如何调用父节点的函数?

【问题讨论】:

  • 您是否尝试过为子节点类实现协议并让父节点成为委托。然后,您可以在父节点收到来自子协议的消息后在父节点中调用该方法

标签: swift sprite-kit parent


【解决方案1】:
if let myParent = self.parent as? Gameboard {
    myParent.unhighlightAllCheckers()
}

你的显式转换没有意义,因为你没有在下一行使用它。

你不是在铸造你实际上是通过调用构造函数来创建一个新的游戏板。强制转换将使用 as 运算符。

更重要的是,当您执行复制/转换/任何操作时,请务必使用您刚刚创建的变量。

如果让 ... 作为? Swift 中的成语非常棒,手册中有更多示例。 https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html

【讨论】:

  • 重要提示: 他的示例根本没有使用“显式转换”或任何“转换”。他正在制作副本
【解决方案2】:

意识到这一点非常重要

let myParent: Gameboard = Gameboard(self.parent)

不是“铸造”。您正在初始化一个基于self.parent 的全新变量。这比其他任何事情都更接近“复制”。

在 Swift 中,您使用 as 运算符进行转换。还有一个可选的转换运算符as?。如果转换不成功,as 将导致程序崩溃,而如果转换不成功,as? 将返回 nil

as 示例:

(self.parent as GameBoard).unhighlightAllCheckers()

as? 示例:

(self.parent as? GameBoard)?.unhighlightAllCheckers()

注意:我在转换后添加了一个?,以使用Optional Chaining,如果转换不返回nil,则只调用unhighlightAllCheckers

如果您需要使用 self.parent 作为 Gameboard 进行多次调用,您可以使用带有Optional Binding 的临时变量:

if let myParent = self.parent as? Gameboard {
    myParent.unhighlightAllCheckers()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多