Следующий код работает, когда я передаю значение вручную, но не получается, когда я разворачиваю значение

Я только начал изучать 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)

Надеюсь, вы сможете понять, чего я пытаюсь достичь, и что я, по крайней мере, близок к тому, чтобы оказаться на правильном пути. Любая помощь будет принята с благодарностью. Спасибо!

2 ответа

Решение

Что действительно может помочь вам решить:

SceneIdentifier.levelOne.rawValue возвращает это -> "LevelOne"

НО

SceneIdentifier(rawValue: "LevelOne") возвращает -> SceneIdentifier.levelOne

Увидеть разницу? В первом вы получаете строку, в этом случае, что вы хотите, а во втором вы получаете "левый член" (я не знаю, терм)

Пример, чтобы увидеть яснее, если у вас есть enum:

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

}

SceneIdentifier(rawValue : "LevelOne") !

возвращает это: SceneIdentifier.case1

а также SceneIdentifier.case1.rawValueвозвращает это: "levelOne"

Так как вы инициализируете с необработанным значением, вам нужно фактически использовать необработанное значение.

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.

Другие вопросы по тегам