【问题标题】:How to pass closure with parameters to a function? (Swift)如何将带参数的闭包传递给函数? (迅速)
【发布时间】:2019-03-17 20:00:30
【问题描述】:

所以我有一个函数需要在满足条件时执行,如果不满足,只需等待 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
    }
}

这给了我以下错误:Missing argument for parameter #1 in call

老实说,我希望延迟函数能够接受任何类型的闭包,而不管其参数(数量或类型)如何。任何帮助表示赞赏;)

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

【问题讨论】:

  • 不要等待 externalCondition。这是一个非常糟糕的做法
  • 对不起@rmaddy,我从我的代码中复制粘贴了它,但我错过了。它正在调用自己(self.delay(function))。 @vadian,不管“坏习惯”如何,此时我有兴趣了解如何将带有参数的闭包传递给函数。我什至如何访问它们(例如,如果在 delay 函数中我想读取其中一个闭包参数)?
  • “老实说,我希望延迟函数能够接受任何类型的闭包,无论其参数(数量或类型)如何。”那意味着什么?在您上面的代码中,您期望str1 具有什么价值? “可以在不指定任何参数的情况下调用此函数”只是一种语法便利。您的延迟函数确实需要两个参数。
  • @Rob 我的意思是我想避免强制我的闭包具有特定的参数类型。不过,我认为我应该为此考虑泛型。 @rmaddy 没错,那是我的错误,在我的代码中,我有一个名称相似的函数,它调用的是它而不是 delay。那么有没有办法在 else 语句中按原样执行闭包,并传递所有参数?
  • 传递了什么参数?我认为您误解了“关闭”是什么。您希望在这里使用什么调用语法?你能写出调用delay的那一行吗?

标签: swift closures


【解决方案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() }

以下也可以:

delay { myFunction("xyz") }

关键是闭包没有参数。您可能将myFunction 视为“关闭”,但这是不正确的。闭包是{...} 部分。如果它有参数,你会期望在其中的某个地方有 x in 语法或 $0

【讨论】:

  • 好的,我明白你在说什么。老实说,我不知道我是怎么错过的。我需要的是拥有delay (_ function : @escaping ()->Void),然后称它为delay{ self.function() }。在我的脑海中,我并没有像通常对待闭包那样对待它,而是试图让延迟函数执行闭包,如果这有意义的话。
猜你喜欢
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多