【发布时间】: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的那一行吗?