以下代码在我手动传递值时有效,但在我解包值时失败

The following code works when I manually pass the value but fails when I unwrap the value

我刚开始学习 Swift 作为我的第一门编码语言。我目前的挑战是尝试自动从当前关卡设置 LevelOne.sks 转换到另一个关卡,该关卡也是在 Xcode 关卡编辑器中创建的 LevelTwo.sks。我正在尝试做的是使用以下代码集触发到下一个级别的转换。

在我的基础场景中,我有这个功能可以让玩家进入下一个级别

private func goToNextLevel(nextLevel: String) {

    //When hard coding the arguments as... 
    //loadScene(withIdentifier: .levelTwo)
    //The level two scene loads and is playable...however,
    //When trying to change the level argument in code
   // by passing a nextLevel variable
   // the optional unwraps nil and crashes the app.

    loadScene(withIdentifier: SceneIdentifier(rawValue: nextLevel)!)

}

然后将其传递给 SceneLoadManager 文件

  enum SceneIdentifier: String {
    case levelOne = "LevelOne"
    case levelTwo = "LevelTwo"
//    case levelThree = "LevelThree"
}

private let sceneSize = CGSize(width: 768, height: 1024)

protocol SceneManager { }
extension SceneManager where Self: SKScene {

    func loadScene(withIdentifier identifier: SceneIdentifier) {


        let reveal = SKTransition.flipHorizontal(withDuration: 0.5)
        let nextLevel = SKScene(fileNamed: identifier.rawValue)
        nextLevel?.scaleMode = .aspectFill
        self.view?.presentScene(nextLevel!, transition: reveal)
    }

我认为这与我尝试设置 nextLevel 的方式有关。目前我的设置如下

let nxtLvl = String?
nxtLvl = ".levelOne"
goToNextLevel(nextLevel: nxtLvl)

希望您能理解我正在努力实现的目标,并且我至少接近于走上正确的轨道。任何帮助将不胜感激。谢谢!

由于您正在使用原始值进行初始化,因此您需要实际使用原始值。

let nxtLvl = String?
nxtLvl = "LevelOne" //this is the rawValue of the .levelOne case
goToNextLevel(nextLevel: nxtLvl)

或者,您可以更改 API,这样 goToNextLevel 就可以像这样接受 SceneIdentifier

//tip: use the parameter name as part of the method name
private func goTo(nextLevel: SceneIdentifier) {

//Then calling the function
goTo(nextLevel: .levelOne)

不过,这可能不适合您 API 的更大范围。

真正可以帮助您解决的问题:

SceneIdentifier.levelOne.rawValue returns 这个 -> "LevelOne"

但是

SceneIdentifier(rawValue : "LevelOne") returns -> SceneIdentifier.levelOne

看出区别了吗? 首先你得到字符串,在那种情况下你想要什么 在第二个你得到 "left member" (我不知道 therm)

如果您有枚举,可以看得更清楚的示例:

enum SceneIdentifier: String {
    case case1 = "LevelOne"
    case case2 = "LevelTwo"

}

SceneIdentifier(rawValue : "LevelOne") !

returns 这个:SceneIdentifier.case1

SceneIdentifier.case1.rawValue returns 这个:"levelOne"