因此,我有一个在满足条件时需要执行的函数,如果不满足,请等待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函数采用任何类型的闭包,而不论其参数(数量或类型)如何。任何帮助表示赞赏;)
编辑:如果不清楚,我希望能够进行任何关闭(使用其所有参数捕获它)并在准备就绪时执行它。
答案 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
语法。