运行函数取决于swift中传递的整数

时间:2014-12-29 17:24:53

标签: ios xcode swift

我想根据所选的级别整数运行不同的函数 所以如果选择的级别是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

我不想为每个级别编写新代码,所以有更好的方法吗?

4 个答案:

答案 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 {}
    }
}