以下代码在我手动传递值时有效,但在我解包值时失败
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"
我刚开始学习 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"