【发布时间】:2017-05-02 20:14:43
【问题描述】:
我想知道是否有更好的方法来编写这段代码。这是非常多余的,在我这样做之前,我认为应该有一种方法可以使用变量作为类名,但遇到了很多问题并最终以这种方式结束。现在每次看都觉得很烦。我对这个主题进行了相当多的研究,但没有提出任何建议。可能是因为我不确定这样做会被称为什么。
为了论证,假设下面的代码在一个函数中,当一个 SKSpriteNode 被点击时被调用。每个“按钮”都以其将要转换到的场景命名。实际上还有 12 个这样的 case 语句。
let name = sender.name
switch(name){
case "newGame":
defaults.set(true,forKey: "isFirstRun")
defaults.set(true,forKey: "isNewGame")
let transition = SKTransition.crossFade(withDuration: 1.0)
let nextScene = Setup(fileNamed:"Setup")
nextScene?.scaleMode = .aspectFill
scene?.view?.presentScene(nextScene!, transition: transition)
break
case "IceFishing":
defaults.set(2, forKey: "currentLocation")
let transition = SKTransition.crossFade(withDuration: 1.0)
let nextScene = IceFishing(fileNamed:"IceFishing")
nextScene?.scaleMode = .aspectFill
scene?.view?.presentScene(nextScene!, transition: transition)
break
case "OpeningScene":
let transition = SKTransition.crossFade(withDuration: 1.0)
let nextScene = OpeningScene(fileNamed:"OpeningScene")
nextScene?.scaleMode = .aspectFill
scene?.view?.presentScene(nextScene!, transition: transition)
break
case "House":
let transition = SKTransition.crossFade(withDuration: 1.0)
let nextScene = SodHouse(fileNamed:"House")
nextScene?.scaleMode = .aspectFill
scene?.view?.presentScene(nextScene!, transition: transition)
break
default:
break
}
我认为(或希望)有一种方法可以做类似...
let name = sender.name
let _Class = name as! SKScene //Not right, but i was guessing
let transition = SKTransition.crossFade(withDuration: 1.0)
let nextScene = _Class(fileNamed:name)
nextScene?.scaleMode = .aspectFill
scene?.view?.presentScene(nextScene!, transition: transition)
所有 sks 文件和 Swift 类的名称都相同。
【问题讨论】:
-
我投票结束这个问题,因为它属于codereview.stackexchange.com
-
你不需要像
SodHouse(fileNamed:"House"),SKScene(fileNamed:"House")会做你想做的事情,只要你的 sks 文件将自定义类设置为正确的类名 -
@Knight0fDragon 如果你刚才说的没错,那我就可以做我想做的事了。但如果是,那么我在这里这样做的目的是什么?我的印象是必须这样做。
-
不,这种方式是旧方式(iOS 9 及之前的版本),如果您需要的类有一个独特的特殊功能,那么您只需转换即可。
if let scene = scene as? SodHouse
标签: swift3 sprite-kit