Swift中的函数数组

Enc*_*PTL 20 swift swift-playground

如何将一组函数存储在稍后在数组中回调,就像在JavaScript中一样?Any和AnyObject类型不能保存具有不同类型的方法签名的函数.

Bru*_*e1q 21

您可以使用枚举将各种函数放入Array中,然后使用开关提取函数.

    enum MyFuncs {
        case Arity0 ( Void -> Void )
        case Arity2 ( (Int, String) -> Void)
    }

    func someFunc(n:Int, S:String) { }
    func boringFunc() {}
    var funcs = Array<MyFuncs>()
    funcs.append(MyFuncs.Arity0(boringFunc))
    funcs.append( MyFuncs.Arity2(someFunc))

    for f in funcs {
        switch f {
        case let .Arity0(f):
            f()  // call the function with no arguments
        case let .Arity2(f):
            f(2,"fred") // call the function with two args
        }
    }
Run Code Online (Sandbox Code Playgroud)


Con*_*nor 8

注意:这个答案适用于Swift 1.0及更低版本.

具有不同参数和返回类型的函数具有不同的类型,因此它们不能一起存储在数组中.它们也不符合Any或AnyObject协议.

如果你有相同参数的函数,你可以解决这个问题.即使下面的函数返回Double和Int的元组,它们都可以定义为() -> Any函数类型.

func func1 () -> Int {
    return 1
}
func func2 () -> (Double, Double){
    return (2, 3)
}
var a: () -> Int = func1
var b: () -> (Double, Double) = func2

var arr: Array< () -> Any> = [a, b]
Run Code Online (Sandbox Code Playgroud)


azd*_*dev 6

下面是一个包含数组和字典的示例.在Xcode 6.1(6A1046a)中测试并使用.请注意,必须首先解开字典中的函数.

然而,当函数具有不同的参数或返回类型时,该技术确实会崩溃,原因在于他的答案中的connor所解释的原因.

class MyViewController: UIViewController
{
    let arrayOfFunctions = [function1, function2]

    let dictionaryOfFunctions = [
        "function1": function1,
        "function2": function2
    ]

    func function1() {
        NSLog("function1")
    }

    func function2() {
        NSLog("function2")
    }

    override func viewDidLoad()
    {
        let fn1 = arrayOfFunctions[0]
        fn1(self)()

        let fn2 = dictionaryOfFunctions["function2"]
        fn2!(self)()
    }
}
Run Code Online (Sandbox Code Playgroud)