【发布时间】:2017-08-29 17:07:17
【问题描述】:
是否可以强制关闭完成?与具有返回值的函数必须始终返回一样,如果有办法强制闭包包含始终完成所需的语法,那将是王牌。
例如,此代码不会编译,因为函数并不总是返回值:
func isTheEarthFlat(withUserIQ userIQ: Int) -> Bool {
if userIQ > 10 {
return false
}
}
以完全相同的方式,我想定义一个带有闭包的函数,如果闭包永远不会返回,它也不会编译。例如,下面的代码可能永远不会返回completionHandler:
func isTheEarthFlat(withUserIQ userIQ: Int, completionHandler: (Bool) -> Void) {
if userIQ > 10 {
completionHandler(false)
}
}
上面的代码可以编译,但我想知道是否有一个关键字强制闭包在所有情况下都发送一个完成处理程序。可能和上面函数中的Void有关?
【问题讨论】:
-
不是语言级别,尽管我对如何实现它有一个有趣的想法。让我尝试一些东西
-
你不能在方法的最后调用完成处理程序吗?
-
@Sweeper 我们的大多数完成处理程序都用于服务器访问,因此它们将返回 (1) 发生的任何错误和 (2) 来自服务器的数据。由于服务器错误与我们希望向用户显示的错误不同,因此我们通常有很多功能可以决定错误是什么,同样我们可能希望以特定方式操作从服务器返回的数据。我所要求的只是编译器确保在代码的所有分支中调用完成处理程序 - 与在普通函数中必须返回返回值的方式完全相同。
-
"我只要求编译器确保在代码的所有分支中调用完成处理程序——与在普通函数中必须返回返回值的方式完全相同。 "您无法让编译器帮助您,但从程序员的角度来看,
defer语句可以满足您的需求。 -
SE-0073 会给你这个,但它被拒绝在命名理由(它被提议作为
@noescape的扩展,现在已弃用)以及需要大量工作的底层实现.希望它是一种能够进入该语言未来版本的功能。