使用函数类型或闭包来动态调用函数

时间:2018-01-18 12:28:19

标签: ios swift closures

我做了一些研究,但我无法解决我的问题。也许是因为我的坏Swift知道如何:(

我有一个开关盒。在每种情况下,我都做同样的事情,但调用不同的功能。有没有一种好的方法可以将重复逻辑移到开关盒外面,只需在case块中设置所需的功能?每个功能的参数也是相同的。

以下是一个示例代码:

switch index {
case 0:
    //do some stuff
    myFuncCase_1(onCompletion: { 
       //do some async stuff
    })
    //do some more stuff
case 1:
    //do some same stuff
    myFuncCase_2(onCompletion: { 
       //do some same async stuff
    })
    //do some more same stuff
default: break
}

所以,唯一的区别是我将要调用的函数的名称 闭包或函数类型是否有一个很好的解决方案?

2 个答案:

答案 0 :(得分:3)

您可以使用嵌套函数来实现此目的。

var emptyLength = $(".MyClass").filter(function() {
    return this.value == "";
}).length;
 if (emptyLength > 0)
{
    alert("Please enter all peramerter's value");
    return;
}

答案 1 :(得分:0)

假设您在某处定义了一些具有相同签名的函数。

func somefunc(callback:()->()) -> () {
    // work, work, work
    callback()
}
func otherfunc(callback:()->()) -> () {
    // work, work, work
    callback()
}

这些函数的类型为(()->())->()

这是一个闭包,它接受一个参数并返回Void。一个参数的类型是一个不带任何东西并且返回Void的闭包。

请注意,参数标签(即回调)不属于该类型。

然后你可以这样做:

var myfunc: (()->())->()
switch index {
case 0:
    myfunc = somefunc
case 1:
    myfunc = otherfunc
default:
    myfunc = { _ in }
}
// do some same stuff
myfunc() {
    // do some same async stuff
}
// do some more same stuff

默认情况下,只创建一个不执行任何操作的匿名闭包。您不能简单地打破默认情况,因为myfunc在使用时会未初始化。