如何在完成处理程序中使用返回值?

Posted

技术标签:

【中文标题】如何在完成处理程序中使用返回值?【英文标题】:how to use the return value in a completion handler? 【发布时间】:2018-10-13 17:27:36 【问题描述】:

我试图更好地理解 swift 中的闭包,并尝试创建一个带有完成处理程序的愚蠢函数,该函数返回一个值,但这个值无处可去...

这就是我所做的......

func productToString(num: Int,num2: Int,completion: (Int)->String)

    let result = num * num2

    completion(result)





let numberToString = productToString(num: 3, num2: 6)  (res) -> String in

    return "string:\(res)"




print(numberToString) // print statement prints ()

当我试图将这个返回值保存在一个变量中时,它只返回了一对弯括号。

我应该如何使用这个返回值?

【问题讨论】:

productToString 没有返回值,值为Void。完成回调的概念是异步性。完成回调的调用时间可能比您的 print 晚得多。 【参考方案1】:

您将值返回到 productToString 函数中,但没有对它做任何其他事情。

func productToString(num: Int,num2: Int,completion: (Int)->String)

    let result = num * num2

    completion(result) // <--- Your return value ends up here

如果您想打印结果,您必须从productToString 函数中再次返回它。

func productToString(num: Int,num2: Int,completion: (Int)->String) -> String 

    let result = num * num2

    return completion(result)

旁注:打印的空括号是一个空元组,相当于 Swift 中的Void

【讨论】:

以上是关于如何在完成处理程序中使用返回值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在视图中显示来自 Swift 完成处理程序的返回值?

与完成处理程序结合使用的返回值存在问题

Xcode 要求在完成处理程序中的返回值名称之前放置 _ [重复]

Alamofire 请求最初返回值,但在通过完成处理程序时被接收为 nil

J2ME - 如何使线程返回一个值,并在该线程完成后,在其他操作中使用返回值?

DispatchQueue.main.async 块中未更新完成处理程序的返回值