我想根据所选的级别整数运行不同的函数 所以如果选择的级别是1那么runfunc1(),如果是2那么runfunc2()... 我知道这可以使用if else
if levelselected == 1 {
runfunc1()
} else if levelseletecd == 2 {
runfunc2()
// ... and so on
}
有没有比这更好的方法,也许是这样的
runfunc%i(),levelselected // I know its not correct but something similar
我不想为每个级别编写新代码,所以有更好的方法吗?
答案 0 :(得分:2)
你可以有一个数组或函数字典。字典可能更好,因为检查级别是否有效的逻辑要简单得多:
let funcs = [1: runfunc1, 2: runfunc2]
if let funcToRun = funcs[levelselected] {
funcToRun()
}
但是,您无法在不使用@objc
功能的情况下轻松地从字符串和数字动态构建函数名称。
(除非您可以将字典的键作为函数名的字符串,但您仍然必须使用在编译时确定的实际函数名来构建字典)
也就是说,您可以从代码中的其他位置添加funcs
变量,这样就可以“连接”#34;新的水平而不改变这种调度逻辑。
答案 1 :(得分:2)
您可以使用以下内容:
var levelSelected = 0 //
var selector = Selector("runFunc\(levelSelected)")
if self.respondsToSelector(selector) {
NSThread.detachNewThreadSelector(selector, toTarget: self, withObject: nil)
}
答案 2 :(得分:1)
不是您正在寻找的确切解决方案,但这可以使其更容易:
声明所需函数的数组:
var levelFunctions: [()->()] = [runfunc1, runfunc2, runfunc3]
此语法声明一个函数数组,它们具有零参数并且不返回任何内容。使用所需的函数名初始化此数组,然后使用levelselected
变量执行所需的函数:
levelFunctions[levelselected]() // Or levelselected-1 if the variable is not zero-based
修改强>
作为评论中提到的Airspeed Velocity和他的答案,你应该确保关卡是在数组范围内。
答案 3 :(得分:1)
我更喜欢创建一个函数,例如runFuncFromLevel::Int -> (() -> Void)
。 runFuncFromLevel
返回您需要的正确功能。
func runFuncFromLevel(level: Int) -> () -> Void
{
switch level
{
case 1: return runfunc1
case 2: return runfunc2
default: return {}
}
}