【问题标题】:Call function from other class in Swift从 Swift 中的其他类调用函数
【发布时间】:2016-01-22 00:14:22
【问题描述】:

我正在尝试使用以下代码从我的 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

我试图让它工作,但没有成功。我该怎么做才能让它发挥作用?

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    协议可能是类之间进行通信的最佳方式,尤其是如果您想保持代码原样。

    在你添加协议的 starNode 类之上

    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(...
    

    所以现在您需要让该类确认您创建的协议。

    class GameScene: SKScene, StarNodeDelegate {
    
    }
    

    比在创建 starNode 实例后在 ViewDidLoad 中添加此代码

    starNode.delegate = self // telling the scene to confirm to the protocol
    

    瞧你的

    func endGame() 
    

    会被调用。

    【讨论】:

      【解决方案2】:

      要调用另一个类的方法,您首先需要创建该(另一个)类的对象,并使用该对象创建类函数。

      类似的,

      假设类名是 AnotherClass,您的 endGame() 函数就在其中。

      class StarNode: GameObjectNode {
      override func collisionWithBall(ball: SKNode) -> Bool {
      
       let obj = AnotherClass()
       obj.endGame()
        return true
          }
      }
      

      【讨论】:

      • 感谢您的回答,但是当我使用此代码时,我收到以下消息:“无法为没有参数的“GameScene”类型调用初始化程序”
      • 检查你的 GameScene 类的初始化(即 init)方法,它必须有一些参数,所以在初始化你的类时,你需要传递这些参数,如果仍然不清楚,请告诉我,我会给你一些链接。
      • 我认为这不是 OP 正在寻找的解决方案。在这个例子中AnotherClass 的实例(我猜是 OP:s 应用程序中的GameScene)已经被初始化了,并且---必须---不是“活动的”。使用上面的解决方案,您可以创建一个新的不相关的GameScene 实例并尝试在这个新实例上调用.endGame()。这类似于在应用程序中创建一个随机的MyViewController 实例来尝试访问当前不在应用程序中的场景的实际 MyViewController 实例中的某些方法。而不是这种方法,我建议在两个类之间使用委托。
      • @dfri 由于 Koffman 提供的代码在没有实例的情况下调用 endGame() 方法,所以我认为他没有 AnotherClass 的实例,这就是我建议这样做的原因
      • @AjayKumar 从代码上下文可以推断出包含.endGame() 的类本身可能包含StarNode 的实例,而不是相反。无论如何,如果您想帮助他,您可能应该向 OP 询问更多上下文,但我的猜测是答案将归结为将来自 StarNode 对象的回调委托给持有 endGame() 方法的类。
      猜你喜欢
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 2020-09-29
      相关资源
      最近更新 更多