我正在尝试使用以下代码从我的 sprite kit/swift 游戏中的另一个类调用一个函数:
class StarNode: GameObjectNode {
override func collisionWithBall(ball: SKNode) -> Bool {
endGame()
return true
}
}
这个函数在另一个类中:
func endGame() {
gameOver = true
GameFile.sharedInstance.saveState()
let reveal = SKTransition.fadeWithDuration(0.5)
let endGameScene = GameOverScene(size: self.size)
self.view!.presentScene(endGameScene, transition: reveal)
}
但是当我调用 endGame() 时,我收到了这条消息:Missing argument for parameter #1 in call。
我试过让它工作但没有成功。我该怎么做才能让它发挥作用?
最佳答案
协议(protocol)可能是类之间通信的最佳方式,尤其是当您希望保持代码原样时。
在 starNode 类之上添加协议(protocol)
protocol StarNodeDelegate: class {
func endGame()
}
比起向 starNode 类添加一个属性
weak var delegate: StarNodeDelegate?
现在您的 starNode 类应该如下所示。
protocol StarNodeDelegate: class {
func endGame()
}
class StarNode: GameObjectNode {
weak var delegate: StarNodeDelegate?
override func collisionWithBall(ball: SKNode) -> Bool {
delegate?.endGame()
return true
}
}
现在在发生碰撞和 gameOver 函数的场景中,我假设您创建了一个 starNode 实例来访问您创建的 StarNode 类。
例如。
let starNode = StarNode(...
所以现在您需要让该类确认您创建的协议(protocol)。
class GameScene: SKScene, StarNodeDelegate {
}
比在创建 starNode 实例后添加此代码的 ViewDidLoad
starNode.delegate = self // telling the scene to confirm to the protocol
瞧你的
func endGame()
会被调用。
关于ios - 从 Swift 中的其他类调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34727894/