两个方法调用之间的区别

Difference between two method calls

给定以下定义:

func retrieveData(for id: Int, completion: @escaping (Record) -> ())

下面两次调用 retrieveData 有什么区别?

第一次通话:

let id: Int = 1 
retrieveData(id: id) {
    self.update(with: [=11=])
}

第二次通话:

let id: Int = 1 
retrieveData(id: id, completion: {
    self.update(with: [=12=])
})

方法中,

func retrieveData(for id: Int, completion: @escaping (Record) -> ())

completion 是一个 尾随闭包 。它是 方法的最终参数 。因此,在 Swift 中,我们可以在调用方法时省略在列表中写入 参数标签 ,即

retrieveData(for: id) {
    //your code..
}

你也可以这样称呼它,

retrieveData(for: id, completion: {
    //your code..
}) 

因此,它可以通过两种方式调用。你的选择。虽然第一个更干净,推荐使用。阅读更多相关信息 here

除了接受的答案-

在Swift中,函数首先是class对象,这意味着它们可以作为参数传递。

在您的示例中,当有一个函数将另一个函数作为参数时,您可以使用尾随闭包语法将参数内联写入:

let id: Int = 1 
retrieveData(id: id) {
    self.update(with: [=10=])
}

但是看看函数update(with:)它是一个接受Record和returns Void的函数。

另一种写法,而不是在闭包中调用函数,是只传递函数:

let id: Int = 1 
retrieveData(id: id, completion: update)

请注意,您没有向它传递参数或烤箱支架。当您以这种方式传递函数时,您传递的是函数本身,而不是计算函数的结果。

我认为这在调用站点更干净。