如何将带有参数的闭包传递给函数? (迅速)

时间:2019-03-17 20:00:31

标签: swift closures

因此,我有一个在满足条件时需要执行的函数,如果不满足,请等待0.2秒,然后重试(递归)。

func myFunction(_ str1: String? = nil, _str2: String? = nil)
{
    //whatever
}

(请注意,我为参数提供了默认值,因此可以在不指定任何参数的情况下调用此函数)。现在,这是我的“延迟”功能:

func delay(_ function: @escaping (String?, String?) -> Void)
{
    if !myExternalCondition
    {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
            self.delay(function)
        }
    }
    else
    {
        function()    //error
    }
}

这给了我以下错误:调用中缺少参数#1的参数

老实说,我希望delay函数采用任何类型的闭包,而不论其参数(数量或类型)如何。任何帮助表示赞赏;)

编辑:如果不清楚,我希望能够进行任何关闭(使用其所有参数捕获它)并在准备就绪时执行它。

1 个答案:

答案 0 :(得分:1)

我认为您误解了默认参数的工作方式。默认参数只是语法帮助器。它们使直接在代码中调用函数更容易,但是它们不会更改函数本身。如果确实需要这些参数,则无法支持任何数量的参数。您需要传递一些东西。

因此,只需扩展它以使语法便利性在重载时变得明显:

num = [8, 9, 4, 1, 2, 3, 4, 4, 8, 9, 1, 2, 3, 0, 1, 5, 6, 1]

for i in range(len(num)-1):  # not using -1 will cause index error
    if num[i] + 1 == num[i + 1]:
        if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
            print('Con', num[i])
        print('Con', num[i + 1])

然后您可以调用它。

func myFunction(_ str1: String?, _str2: String?)
{
    //whatever
}

func myFunction() {
    myFunction(nil, nil)
}

您可能只是误解了闭包的工作原理。使用上面的func delay(_ function: @escaping () -> Void) { if !myExternalCondition { DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { self.delay(function) } } else { function() } } ,使用原始的delay定义(带有默认参数)可以很好地实现以下目的:

myFunction

以下内容也可以:

delay { myFunction() }

重点是 closure 没有参数。您可能将delay { myFunction("xyz") } 视为“关闭”,但这是不正确的。闭包是myFunction部分。如果有参数,则可能期望使用{...}语法或x in语法。