我在 Xcode 中遇到了问题。它给了我“线程 1:信号 SIGABRT”

I am having a problem in Xcode. It gives me "Thread 1: signal SIGABRT"

提问人:Toast Beans 提问时间:9/7/2023 最后编辑:HangarRashToast Beans 更新时间:9/8/2023 访问量:45

问:

import UIKit
import SpriteKit
import GameplayKit

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let view = self.view as! SKView? { <-- THE "as!" IN THIS LINE
            // Load the SKScene from 'GameScene.sks'
            if let scene = SKScene(fileNamed: "GameScene") {
                // Set the scale mode to scale to fit the window
                scene.scaleMode = .aspectFill
                
                // Present the scene
                view.presentScene(scene)
            }
            
            view.ignoresSiblingOrder = true
            
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }
}

我试图重写代码,但这无济于事。

iOS Swift Sprite-Kit

评论

0赞 vadian 9/7/2023
你有条件地强制将可选的解包到可选的,这没有意义,甚至会导致崩溃。替换为 which 计算结果为 如果视图不是 .as! SKView?as? SKViewfalseSKView

答:

0赞 adamjansch 9/7/2023 #1

取代:

if let view = self.view as! SKView?

跟:

if let view = self.view as? SKView

感叹号是一个不安全的解包——如果不是 SKView,那么它就会崩溃。self.view

但是,由于您无论如何都要通过 if 语句进行解包,因此只需使用问号的安全解包即可。If 不是 SKView,则不会执行 if 块中的代码。self.view

评论

0赞 HangarRash 9/8/2023
最有可能的是,这个答案将导致一个问题:“为什么我的观点不是SKView?OP 似乎正在使用 Sprite Kit,并期望主视图是 Sprite Kit 视图。这个答案并不能解决真正的问题。
1赞 adamjansch 9/8/2023
@HangarRash 所以让我们问这个问题。这个问题是“为什么我的代码崩溃了?”,这就是这个问题的答案。