在Swift中调用父函数

时间:2014-07-30 18:10:53

标签: swift sprite-kit parent

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

self.parent.unhighlightAllCheckers()

没有工作。我认为这是因为子节点可能不会隐式知道父节点的对象类型,所以我尝试一个显式的转换:

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

也不起作用。我认为这应该简单得多。你如何称呼父节点的功能?

2 个答案:

答案 0 :(得分:6)

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

由于你没有在下一行使用它,你所做的明确演员没有意义。

您并没有通过调用构造函数来实际创建新的Gameboard。转换将使用as运算符。

更重要的是,当您复制/转换/确定使用您刚刚创建的变量时。

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

答案 1 :(得分:4)

认识到这一点非常重要

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()
}