此代码来自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()
}
答案 0 :(得分:2)
如果创建一个带闭包作为其输入参数之一的函数,则在inputParameterName()
调用闭包后立即执行闭包。输入参数名称后面的括号标记函数调用,没有输入参数给闭包,因为它的类型是Void->Void
。
在你的第二个例子中,
thisNeedsToFinishBeforeWeCanDoTheNextStep { () -> () in
thisFunctionNeedsToExecuteSecond()
}
你看到一个尾随的闭包。如果函数的最后一个输入参数是闭包,则可以将函数调用转换为尾部闭包语法,您可以在其中省略闭包的名称(在您的情况下为完成)以及{}
之间的代码一旦调用闭包就被执行。
所以上面的代码相当于
thisNeedsToFinishBeforeWeCanDoTheNextStep(completion: { () -> () in
thisFunctionNeedsToExecuteSecond()
})