是作为在swift中分配给参数名称的参数传入的闭包吗?

时间:2017-12-23 11:00:16

标签: swift closures

此代码来自this博客。

我们可以调用completion()的原因是因为() -> ()中传递的闭包实际上是分配给参数完成的,所以调用完成会执行闭包吗?

func thisNeedsToFinishBeforeWeCanDoTheNextStep(completion: () -> ()) {
    print("The quick brown fox")
    completion()
}

func thisFunctionNeedsToExecuteSecond() {
   print("jumped over the lazy dog")
}

如果是这样的话:调用下面的函数我不能完全理解下面的代码如何转换成在thisFunctionNeedsToExecuteSecond()之前被调用和完成的第一个函数?我的意思是()->()如何导致completion()thisFunctionNeedsToExecuteSecond()被调用之前执行 - 它很难以书面形式解释这一点。

thisNeedsToFinishBeforeWeCanDoTheNextStep { () -> () in
    thisFunctionNeedsToExecuteSecond()
}

1 个答案:

答案 0 :(得分:2)

如果创建一个带闭包作为其输入参数之一的函数,则在inputParameterName()调用闭包后立即执行闭包。输入参数名称后面的括号标记函数调用,没有输入参数给闭包,因为它的类型是Void->Void

在你的第二个例子中,

thisNeedsToFinishBeforeWeCanDoTheNextStep { () -> () in
    thisFunctionNeedsToExecuteSecond()
}

你看到一个尾随的闭包。如果函数的最后一个输入参数是闭包,则可以将函数调用转换为尾部闭包语法,您可以在其中省略闭包的名称(在您的情况下为完成)以及{}之间的代码一旦调用闭包就被执行。

所以上面的代码相当于

thisNeedsToFinishBeforeWeCanDoTheNextStep(completion: { () -> () in
    thisFunctionNeedsToExecuteSecond()
})