Первое, что нужно понять, это то, что оно не одновременное. Он вызывается дважды, но по одному.
Итак, чтобы решить эту проблему, просто добавьте код к gameOver()
так, чтобы второй вызов игнорировался. Например.
var gameIsOver = false
func gameOver() {
guard !gameIsOver else { return }
gameIsOver = true
UserDefaults.standard.set(score, forKey: "RecentScore")
if score > UserDefaults.standard.integer(forKey: "Highscore") {
UserDefaults.standard.set(score, forKey: "Highscore")
}
let menuScene = MenuScene(size: view!.bounds.size)
view!.presentScene(menuScene)
}
Если вы повторно используете этот объект, вам нужно сбросить gameIsOver
обратно на false.
Другой способ решить эту проблему - сделать безопасным вызов более одного раза. , Возможно, view
равен нулю во втором вызове.
Вы никогда не должны использовать view!
, если можете помочь. Лучший подход -
guard let view = view else { return }
В начале. Если view равен нулю, функция немедленно вернется. В остальных случаях вы можете использовать view.bounds
или view.presentScene
, потому что вид не может быть нулевым после охраны.