在Swift中,我试图在节点的父节点上调用一个函数,如下所示:
self.parent.unhighlightAllCheckers()
没有工作。我认为这是因为子节点可能不会隐式知道父节点的对象类型,所以我尝试一个显式的转换:
let myParent: Gameboard = Gameboard(self.parent)
myParent.unhighlightAllCheckers()
也不起作用。我认为这应该简单得多。你如何称呼父节点的功能?
答案 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()
}