Ios 根据swift中传递的整数运行函数

Ios 根据swift中传递的整数运行函数,ios,xcode,swift,Ios,Xcode,Swift,我想根据所选的整数级别运行不同的函数 因此,如果所选级别为1,则为runfunc1(),如果为2,则为runfunc2()。。。 我知道这是可能的使用如果其他 if levelselected == 1 { runfunc1() } else if levelseletecd == 2 { runfunc2() // ... and so on } 有没有比这更好的办法,或者像这样的 runfunc%i(),levelselected // I know its not

我想根据所选的整数级别运行不同的函数 因此,如果所选级别为1,则为runfunc1(),如果为2,则为runfunc2()。。。 我知道这是可能的使用如果其他

if levelselected == 1 {
    runfunc1()
} else if levelseletecd == 2 {
    runfunc2()
    // ... and so on
}
有没有比这更好的办法,或者像这样的

runfunc%i(),levelselected // I know its not correct but something similar

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

您可以拥有一个数组或函数字典。字典可能更好,因为检查级别是否有效的逻辑要简单得多:

let funcs = [1: runfunc1, 2: runfunc2]

if let funcToRun = funcs[levelselected] {
    funcToRun()
}
但是,如果不使用
@objc
功能,您将无法轻松地从字符串和数字动态构建函数名

(除非您可以将字典的键设置为函数名的字符串,但仍然必须使用编译时确定的实际函数名来构建字典)


也就是说,您可以从代码中的其他位置添加到
funcs
变量,这样就意味着可以“连接”新的级别,而无需更改此调度逻辑。

这不是您正在寻找的确切解决方案,但这可以使它更容易:

声明所需函数的数组:

var levelFunctions: [()->()] = [runfunc1, runfunc2, runfunc3]
此语法声明了一个具有零参数且不返回任何内容的函数数组。使用所需函数名初始化此数组,然后使用
levelselected
变量执行所需函数:

levelFunctions[levelselected]() // Or levelselected-1 if the variable is not zero-based
编辑:


正如评论和他的回答中提到的空速,你应该确保水平面在阵列边界内

您可以使用以下内容:

var levelSelected = 0 //

var selector = Selector("runFunc\(levelSelected)")
if self.respondsToSelector(selector) {
    NSThread.detachNewThreadSelector(selector, toTarget: self, withObject: nil)
}

我更喜欢创建一个函数,例如
runFuncFromLevel::Int->(()->Void)
runFuncFromLevel
返回所需的正确函数

func runFuncFromLevel(level: Int) -> () -> Void
{
    switch level
    {
        case 1: return runfunc1
        case 2: return runfunc2
        default: return {}
    }
}

您也可以使用switch语句。你不能把变量作为函数名的一部分。是的,我知道开关,但仍然必须为每个级别编写类似的代码。也许然后有一个函数并将级别选择传递给它。这是一样的,不是吗?因为我将把levelselected传递给这个函数。在这个函数中,我必须使用switch或者Agani实际上最喜欢这个函数,因为它对读者来说非常明确,并且它强制两个相关函数之间保持某种一致性。也就是说,空速回答更“快速”,更干净。它依赖于所有函数都是同一类上的方法(它需要继承自
NSObject
)。如果你用自由函数尝试它,它就不会起作用。这一个有效,我认为@giorashc的代码更容易记住,如果你传递的
levelselected
大于数组中的有效函数,它就会爆炸。