两个方法调用之间的区别

Posted

技术标签:

【中文标题】两个方法调用之间的区别【英文标题】:Difference between two method calls 【发布时间】:2020-05-06 10:41:16 【问题描述】:

给定以下定义:

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

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

第一次调用:

let id: Int = 1 
retrieveData(id: id) 
    self.update(with: $0)

第二次调用:

let id: Int = 1 
retrieveData(id: id, completion: 
    self.update(with: $0)
)

【问题讨论】:

【参考方案1】:

在方法中,

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

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

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

你也可以这样称呼,

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

所以,它可以以两种方式调用。你的选择。虽然第一个更清洁和推荐。阅读更多关于它的信息here。

【讨论】:

【参考方案2】:

除了接受的答案 -

在 Swift 中,函数是第一类对象,这意味着它们可以作为参数传递。

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

let id: Int = 1 
retrieveData(id: id) 
    self.update(with: $0)

但是看看函数update(with:),它是一个接受Record并返回Void的函数。

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

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

请注意,您没有将参数或烤箱括号传递给它。当你以这种方式传递一个函数时,你传递的是函数本身,而不是评估函数的结果。

我认为这在呼叫现场更干净。

【讨论】:

以上是关于两个方法调用之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Python的实例方法,类方法,静态方法之间的区别及调用关系

save(),saveOrUpdate(),merge()的区别

save()/saveOrUpdate()/merge()的区别

save(),saveOrUpdate(),merge()的区别

save(),saveOrUpdate(),merge()的区别

save(),saveOrUpdate(),merge()的区别