【发布时间】:2019-01-23 18:17:23
【问题描述】:
我写了一个函数,它接受一个闭包作为这样的参数:
func doSome(work: () -> Void = { print("sleeping...") } ) {
work()
}
现在我想调查一下work 所做的事情。
因此我想检查给定的闭包是否包含任何打印语句。
有点像这样:
func doSome(work: () -> Void = { print("doing hard work...") } ) {
work()
if work.contains(print) {
print("we did some hard work there and printed something!")
}
}
我怎样才能做到这一点?
编辑:我想要实现的目标
一个异步函数尝试连接到一个 http 服务器——我们称之为connect。它接受一个闭包作为它的参数——称为finally。正如它的名字已经表明的那样:在连接尝试之后,闭包被执行。
如果连接尝试成功(http 响应代码 == 200),我需要调用另一个函数一次 - 让我们这样称呼它:once。
connect 函数因此如下所示:
func connect(finally: () -> Void = {}) {
httpRepsonse = asyncRequestToServer()
if httpResponse.statusCode == 200 {
once()
}
// and finally:
finally()
}
其他函数调用connect 并传递它们的语句,它们需要连接函数执行finally。
问题来了:有一个函数需要 once 每次执行,因此它在 finally 闭包中传递它。如果现在连接成功,once 会被调用两次。
这就是为什么我想检查给定的闭包是否已经包含 once 调用,所以我可以避免调用它两次。
【问题讨论】:
-
Swift 没有这种追溯能力。一方面,代码被优化,许多函数被内联等等,这使得很难判断原始函数调用是什么样的
-
你到底想用这个实现什么?也许我们可以提出一个更可行的方法
-
所以如果我理解的话,有一个实例,其中
finally块包含对once()的调用,即使在状态代码不是 200 的情况下也应该发生这种情况,但是如果状态码恰好是 200,您不希望发生 2 个once调用吗? -
@Alexander 是的,你理解正确。我想我可以很容易地“看看里面”给定的闭包。但是另一个布尔参数(或期望一个导致布尔值的闭包)将是最简单的解决方案
-
与其放入这个脚手架,本质上是“这样做以适应大多数情况,然后弄清楚如何以不同的方式处理特殊情况”,而是将 HTTP 响应放入闭包中,这样每个闭包都可以准确定义它的响应方式。